Risoluzione dei Problemi di Autorizzazioni negati in Docker

Eseguire applicazioni con Docker come routine quotidiana può diventare un incubo quando si incontra un errore come “Docker permission denied” durante il tentativo di connessione. Ma non preoccuparti, questo articolo ti aiuterà a tornare in pista.

In questo tutorial, imparerai molteplici modi per risolvere il temuto messaggio di errore “Docker permission denied”.

Prerequisiti

Questo tutorial include dimostrazioni pratiche. Per seguirla, assicurati di avere quanto segue:

  • Le dimostrazioni in questo tutorial sono eseguite su Ubuntu 20.04, ma altre distribuzioni Linux funzioneranno anche.
  • Il motore Docker, con la versione del tutorial 20.10.8, build 3967b7d.

Eseguire comandi Docker con privilegi elevati

Diversi fattori potrebbero causare un errore di permission denied durante la connessione a Docker. Uno di questi è l’esecuzione dei comandi Docker senza anteporre il comando sudo. Il comando sudo ti fornisce diritti amministrativi elevati insieme a privilegi di sicurezza durante l’esecuzione dei comandi.

Di seguito puoi vedere il temuto errore di permission denied durante il tentativo di eseguire un comando docker.

Running into a permission denied error

Lancia il tuo terminale e anteporre sudo al comando docker di seguito per eseguire l’immagine Docker hello-world. Poiché stai eseguendo un comando con privilegi elevati, dovrai inserire la tua password per procedere.

sudo docker run hello-world

Vedrai un output simile a quello mostrato di seguito che indica che Docker è stato installato correttamente.

Running Elevated (sudo) Docker Commands

Riavvio del motore Docker

Se l’esecuzione di comandi Docker con privilegi elevati non risolve l’errore di permesso negato, verifica che il tuo Motore Docker sia in esecuzione. Similmente all’esecuzione di un comando docker senza il comando sudo, un Motore Docker fermo provoca l’errore di permesso negato. Come si risolve l’errore? Riavviando il motore Docker.

Esegui il comando systemctl di seguito per confermare lo stato del Motore Docker (status docker) e se è in esecuzione.

sudo systemctl status docker

Di seguito, puoi vedere che il Motore Docker è in esecuzione dallo stato restituito che mostra unttivo (in esecuzione).

Displaying Docker Engine status

Se il Motore Docker non è attivo, esegui il comando systemctl di seguito per avviare il Motore Docker (start docker).

sudo systemctl start docker

Ora, esegui il comando Docker hello-world come hai fatto nella sezione “Esecuzione di comandi Docker con privilegi elevati” per verificare che l’errore sia risolto.

sudo docker run hello-world

Aggiunta di un account utente a un gruppo con accesso utente non root

Hai confermato che il tuo motore Docker funziona, ma stai ancora ricevendo un errore di permessi negati di Docker? In tal caso, è necessario aggiungere il tuo account utente a un gruppo con accesso utente non root. Perché? Perché qualsiasi comando Docker che esegui su una macchina Linux che non è nel gruppo utente attiva un errore di permessi negati.

  1. Esegui il comando groupadd di seguito per creare un nuovo gruppo chiamato docker. Inserisci la tua password per continuare l’esecuzione del comando.
sudo groupadd docker

Se il gruppo docker esiste nel gruppo utente, vedrai un output simile a quello riportato di seguito.

Creating a New Group Named ‘docker’

2. Successivamente, esegui il comando usermod di seguito, dove le opzioni -aG indicano al comando di aggiungere il tuo account utente (programmer) al gruppo (docker). Questo comando fa sì che il tuo account utente abbia accesso non utente.

sudo usermod -aG docker programmer

3. Esegui il comando newgrp di seguito per cambiare l’attuale ID del gruppo reale al gruppo docker.

Esegui questo comando ogni volta che vuoi eseguire Docker come utente non root.

sudo newgrp docker 

4. Infine, riesegui l’immagine Docker hello-world per confermare che non visualizzi più l’errore. Se, a questo punto, stai ancora ottenendo un errore, considera di concedere maggiori autorizzazioni al file docker.sock. Il file docker.sock è il socket UNIX, un modo per comunicare informazioni di processo tra l’utente e il sistema, a cui il demone Docker ascolta come punto di ingresso dell’API di Docker.

Esegui il comando chmod riportato di seguito per concedere a tutti gli utenti l’accesso in lettura/scrittura (666) al file /var/run/docker.sock. Ora esegui nuovamente l’immagine Docker hello-world per verificare se l’errore è risolto.

sudo chmod 666 /var/run/docker.sock

Modifica del file di unità di servizio Docker

Se eseguire Docker come utente non root non è sufficiente a risolvere l’errore, prova a modificare il file di unità di servizio SystemD Docker, un sistema di controllo dei servizi. Il file di servizio Docker contiene parametri sensibili che possono alterare il comportamento del demone Docker. Puoi modificare il comportamento predefinito del file di unità Docker aggiungendo un comando aggiuntivo per cambiare il comportamento predefinito del servizio.

1. Esegui il comando sottostante per aprire il file di unità di servizio Docker nel tuo editor di testo preferito. Per questo esempio, il file di servizio Docker si apre nell’editor di testo nano.

sudo nano /usr/lib/systemd/system/docker.service

2. Trova l’area con l’intestazione del [Servizio] all’interno del file di unità del servizio Docker, come mostrato di seguito. Copia e incolla i comandi seguenti nel file di unità del servizio Docker e salva le modifiche.

Di seguito, il comando SupplementaryGroups imposta i gruppi Unix supplementari dove vengono eseguiti i processi. Allo stesso tempo, il comando ExecStartPost pulisce le operazioni eseguite anche se il servizio non riesce a avviarsi correttamente.

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock
Editing the Docker Service Unit File

3. Ora, esegui i comandi seguenti per riavviare ed abilitare il servizio Docker. Farlo ti permette di avviare il servizio Docker da capo per evitare errori quando esegui comandi Docker.

# Ricarica tutti i file di unità Docker e ricrea l'intero albero delle dipendenze.
sudo systemctl daemon-reload
# Riavvia il servizio Docker
sudo systemctl start docker
# Abilita Docker per l'esecuzione sul tuo computer.
sudo systemctl enable docker

4. Infine, esegui nuovamente l’immagine Docker hello-world e verifica se ottieni ancora l’errore di permesso negato.

Esecuzione di Docker in Modalità Privilegiata

Ultimo ma non meno importante, nella lista dei fix per l’errore di permesso negato di Docker c’è l’esecuzione di Docker in modalità privilegiata. Farlo concede a un contenitore Docker l’accesso root al sistema.

Eseguire Docker in modalità privilegiata è rischioso e vulnerabile agli attacchi da parte di hacker. Quindi sii cauto e esegui Docker in modalità privilegiata solo quando sai esattamente cosa stai facendo.

1. Esegui il comando di seguito per elencare tutti i container Docker nel tuo sistema e ottenere l’ID del container che desideri eseguire.

sudo docker ls -a
Listing all Docker Containers in the System

2. Successivamente, esegui il comando docker inspect di seguito per verificare se il container che desideri eseguire è già in modalità privilegiata (--format='{{.HostConfig.Privileged}}'). Sostituisci CONTAINER_ID di seguito con l’effettivo ID del container che hai annotato nel passaggio uno.

docker inspect --format='{{.HostConfig.Privileged}}' CONTAINER_ID

Se il container è in modalità privilegiata, il comando restituisce un valore true alla console. Ma se il comando restituisce un valore falso, come mostrato di seguito, passa al passaggio successivo.

Checking if a Container is in Privileged Mode

3. Infine, esegui il comando docker di seguito per eseguire il container Docker in modalità privilegiata (--privileged hello-world).

sudo docker run --privileged hello-world

Conclusione

In questo tutorial, hai imparato molti modi per risolvere l’errore di autorizzazione Docker permission denied, dall’esecuzione di comandi elevati all’esecuzione di Docker in modalità privilegiata.

Ora sai come eliminare un errore durante la creazione di applicazioni basate su Docker; forse desideri anche mantenere le tue immagini Docker pulite in ogni momento?

Source:
https://adamtheautomator.com/docker-permission-denied/