Отказано в доступе к сокету демона Docker в unix: ///var/run/docker.sock - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть 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}

То, что я строю так:

docker build --tag my-gulp:latest .

и, наконец, запускается script таким образом:

#!/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

, который правильно регистрирует меня в контейнере докера, но когда я хочу видеть изображения

docker images

или попробуйте вытащить изображение

docker pull hello-world:latest

Я получаю эту ошибку:

Получено отказ в разрешении при попытке подключения к сокету демона Docker в unix: ///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/json: dial unix /var/run/docker.sock: connect: разрешение отказано

Как создать образ докера из chekote/gulp:latest, чтобы я мог использовать внутри него докер без ошибки?

Или, может быть, ошибка из-за неправильной команды запуска Docker?

Ответы [ 4 ]

0 голосов
/ 03 ноября 2018

Соответствие разрешений происходит только для числовых идентификаторов пользователей и групп. Если файл сокета находится в режиме 0660 и принадлежит идентификатору пользователя 0 и идентификатору группы 32, и вы вызываете его как пользователя с идентификатором пользователя 1000 и идентификаторами группы 1000 и 16, не имеет значения, если одно /etc/group имя файла gid 32 как docker, а другой называет gid 16 таким же; числовые значения отличаются, и вы не можете получить доступ к файлу. Кроме того, поскольку фактический числовой код группы Docker может различаться в разных системах, это не то, что вы можете вставить в Dockerfile.

Многие образы Docker просто запускаются от имени root; в противном случае они могут получить доступ к файлу сокета Docker, смонтированному на привязке, независимо от его разрешений.

Если вы работаете как пользователь без полномочий root, вы можете использовать опцию docker run --group-add , чтобы добавить (числовой) gid эффективному пользователю; это не обязательно должно быть упомянуто в файле /etc/groups. На хосте Linux вы можете запустить:

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

Обычно вы не устанавливаете sudo в Dockerfile (он плохо работает с неинтерактивными программами, вы обычно не делаете много в интерактивных оболочках из-за эфемерной природы контейнеров, и вы всегда может docker exec -u 0 получить оболочку root), хотя установка некоторого пользователя без полномочий root часто считается лучшей практикой. Вы можете уменьшить Dockerfile до

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"]

( Этот базовый образ Docker имеет пару из вещей , которые на самом деле не соответствуют Docker лучшие практики, и, кажется, не обновляются регулярно, я бы просто использовал стандартный node образ в качестве основы и добавил бы один инструмент сборки, который вам нужен.)

0 голосов
/ 03 ноября 2018

Вам нужен флаг --privileged с вашей командой запуска docker.

Кстати, вы можете просто использовать докер в докере, изображение из докера для этого вида использования.

https://asciinema.org/a/24707

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

0 голосов
/ 03 ноября 2018

Быстрый способ избежать этого. Добавьте вашего пользователя в группу.

sudo gpasswd -a $USER docker

Затем установите правильные разрешения.

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

Оттуда должно быть хорошо.

0 голосов
/ 03 ноября 2018

Ошибка не имеет ничего общего с подкомандой docker pull или docker image, а скорее заключается в том, что вам нужно вызывать команду docker как любой пользователь с правами на запись в сокет докера (например, будучи пользователем root, используя sudo, или находясь в группе докеров).

...