web-dev-qa-db-ja.com

unix:///var/run/docker.sockのDockerデーモンソケットへのアクセスが拒否されました

私はこれを持っています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コンテナーに適切にログインしますが、画像を表示したい場合

docker images

または画像を引っ張ってみてください

docker pull hello-world:latest

私はこのエラーを受け取ります:

Unix:///var/run/docker.sockでDockerデーモンソケットに接続しようとしているときに権限が拒否されました:Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/ json :unix /var/run/docker.sockにダイヤル:接続:権限が拒否されました

chekote/gulp:latestからdockerイメージを作成して、エラーなしで内部でdockerを使用する方法は?

または、エラーは間違ったdocker runコマンドが原因ですか?

7
Jimmix

権限の一致は、numericユーザーIDとグループIDでのみ発生します。ソケットファイルがモード0660であり、ユーザーID 0およびグループID 32によって所有されており、ユーザーID 1000およびグループID 1000および16のユーザーとしてそれを呼び出している場合、1つの/etc/groupは問題ではありません。ファイルはgid 32をdockerと名付け、他のファイルはgid 16と同じ名前を付けます。数値gidが異なり、ファイルにアクセスできません。また、Dockerグループの実際の数値gidはシステムによって異なるため、Dockerfileに焼き付けることはできません。

多くのDockerイメージはrootとして実行されます。アクセスできる場合は、権限に関係なく、バインドマウントされたDockerソケットファイルにアクセスできます。

Root以外のユーザーとして実行する場合は、 docker run --group-addオプション を使用して、有効なユーザーに(数値)gidを追加できます。特に/etc/groupsファイルで言及する必要はありません。 Linuxホストでは、次のコマンドを実行できます。

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

通常、DockerfileにSudoをインストールしません(非対話型プログラムではうまく機能しません。コンテナーの一時的な性質のため、対話型シェルでは通常、あまり多くを行いません。ルートシェルを取得するために常にdocker exec -u 0を実行できます)が、非ルートユーザーをインストールすることは、多くの場合ベストプラクティスと見なされます。あなたは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ベースイメージ には acoupleofthings はありませんDockerのベストプラクティスと一致し、定期的に更新されていないようです。標準のnodeイメージをベースとして使用し、その上に必要な1つのビルドツールを追加します。)

2
David Maze

それを回避する簡単な方法。ユーザーをグループに追加します。

Sudo gpasswd -a $USER docker

次に、適切な権限を設定します。

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

そこから良いはずです。

7
R J

Docker runコマンドで--privilegedフラグが必要です。

ちなみに、このようなユースケースでは、docker in docker、dockerからのイメージを使用できます。

https://asciinema.org/a/24707

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

0
Ijaz Ahmad Khan

エラーはdocker pullまたはdocker imageサブコマンドとは関係ありませんが、Dockerコマンドを、Dockerソケットへの書き込みアクセス権を持つユーザーとして呼び出す必要があります(たとえば、rootになるか、Sudoを使用するか、またはDockerグループ)。

0
Lie Ryan