web-dev-qa-db-fra.com

Autorisation refusée au socket du démon Docker sous unix: ///var/run/docker.sock

J'ai cette Dockerfile:

FROM chekote/gulp:latest 

USER root
RUN apt-get update \
      && apt-get upgrade -y \
      && apt-get install -y Sudo libltdl-dev

ARG dockerUser='my-user-name';
ARG group='docker';

# crate group if not exists
 RUN if ! grep -q -E "^$group:" /etc/group; then groupadd $group; fi

# create user if not exists
 RUN if ! grep -q -E "^$dockerUser:" /etc/passwd; then useradd -c 'Docker image creator' -m -s '/bin/bash' -g $group $dockerUser; fi

# add user to the group (if it was present and not created at the line above)
 RUN usermod -a -G ${group} ${dockerUser}

# set default user that runs the container
 USER ${dockerUser}

Que je construis de cette façon:

docker build --tag my-gulp:latest .

et enfin géré par script de cette façon:

#!/bin/bash

image="my-gulp:latest";
workDir='/home/gulp/project';

docker run -it --rm  \
-v $(pwd):${workDir} \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
${image} /bin/bash

qui me connecte dans le conteneur de docker correctement, mais quand je veux voir des images

docker images

ou essayer de tirer l'image

docker pull hello-world:latest

Je reçois cette erreur:

A obtenu l'autorisation refusée lors d'une tentative de connexion au socket du démon Docker sous unix: ///var/run/docker.sock: Get http: //%2Fvar%2Frun%2Fdocker.sock/v1.38/images/json : compose unix /var/run/docker.sock: connect: autorisation refusée

Comment créer une image de menu fixe à partir de chekote/gulp:latest afin que je puisse utiliser le menu fixe à l'intérieur sans l'erreur?

Ou peut-être que l'erreur est due à une mauvaise commande d'exécution du menu fixe?

1
Jimmix

La correspondance des autorisations ne concerne que les ID utilisateur/groupe et numérique. Si le fichier de socket est en mode 0660 et appartient à l'ID utilisateur 0 et à l'ID de groupe 32 et que vous l'appelez en tant qu'utilisateur avec l'ID utilisateur 1000 et les ID de groupe 1000 et 16, peu importe si l'un des noms de fichier /etc/group est gid 32 comme docker et l'autre nomme gid 16 le même; les gids numériques sont différents et vous ne pouvez pas accéder au fichier. De plus, étant donné que le gid numérique du groupe Docker varie d’un système à l’autre, vous ne pouvez pas en créer dans le fichier Docker.

De nombreuses images Docker fonctionnent simplement en tant que root; Dans ce cas, ils peuvent accéder à un fichier de socket Docker monté sur la liaison, quelles que soient ses autorisations.

Si vous vous exécutez en tant qu'utilisateur non root, vous pouvez utiliser l'option docker run --group-add pour ajouter un gid (numérique) à l'utilisateur effectif; il n'est pas nécessaire qu'il en soit fait mention dans le fichier /etc/groups. Sur un hôte Linux, vous pouvez exécuter:

docker run --group-add $(getent group docker | cut -d: -f3) ...

Vous n’installez généralement pas Sudo dans un fichier Docker (cela ne fonctionne pas bien pour les programmes non interactifs, vous ne faites généralement pas beaucoup dans les shells interactifs en raison de la nature éphémère des conteneurs, et vous pouvez toujours docker exec -u 0 pour obtenir un shell racine) bien que l’installation d’un utilisateur non root soit souvent considérée comme une pratique recommandée. Vous pouvez réduire le fichier Docker à

FROM node:8
RUN apt-get update
# Trying to use the Host's `docker` binary may not work well
RUN apt-get install -y docker.io
# Install the single node tool you need
RUN npm install -g gulp
# Get your non-root user
RUN adduser myusername
# Normal Dockerfile bits
WORKDIR ...
COPY ...
RUN gulp
USER myusername
CMD ["npm", "run", "start"]

( Cette image de base de Docker a uncoupledechoses qui ne correspond pas vraiment aux meilleures pratiques de Docker et ne semble pas être mise à jour régulièrement; Je voudrais simplement utiliser l'image node standard comme base et ajouter l'outil de construction dont vous avez besoin par dessus.)

2
David Maze

Un moyen rapide d'éviter cela. Ajoutez votre utilisateur au groupe.

Sudo gpasswd -a $USER docker

Puis définissez les autorisations appropriées.

Sudo setfacl -m user:<your username>:rw /var/run/docker.sock

Devrait être bon à partir de là.

7
R J

Vous avez besoin du drapeau --privileged avec votre commande docker run.

Au fait, vous pouvez simplement utiliser le menu fixe dans le menu fixe, image du menu fixe pour ce type de cas d'utilisation.

https://asciinema.org/a/24707

https://hub.docker.com/_/docker/

0
Ijaz Ahmad Khan

L’erreur n’a rien à voir avec la sous-commande docker pull ou docker image. Vous devez plutôt appeler la commande docker en tant qu’utilisateur disposant d’un accès en écriture au socket de ce menu fixe (par exemple, en étant root, en utilisant Sudo ou dans le groupe docker).

0
Lie Ryan