私はこれを持っています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コマンドが原因ですか?
権限の一致は、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つのビルドツールを追加します。)
それを回避する簡単な方法。ユーザーをグループに追加します。
Sudo gpasswd -a $USER docker
次に、適切な権限を設定します。
Sudo setfacl -m user:<your username>:rw /var/run/docker.sock
そこから良いはずです。
Docker runコマンドで--privilegedフラグが必要です。
ちなみに、このようなユースケースでは、docker in docker、dockerからのイメージを使用できます。
エラーはdocker pullまたはdocker imageサブコマンドとは関係ありませんが、Dockerコマンドを、Dockerソケットへの書き込みアクセス権を持つユーザーとして呼び出す必要があります(たとえば、rootになるか、Sudoを使用するか、またはDockerグループ)。