はじめに
多くの人がDockerを利用していて、パーミッションがらみの問題を経験したことがあるはずです。
Dockerはパーミッション周りが少しめんどくさくて厄介ですよね。
今回の記事では、Dockerにおけるパーミッションの扱いと対応策についてまとめていきます。
Dockerでのパーミッション問題
Dockerではホスト側のディレクトリをコンテナ内にマウントする際はパーミッションを一切変更しません。
したがって、Dockerコンテナ内で開発する際には、パーミッションの問題が頻繁に発生します。
例えば、次のDockerfileでは、ユーザー(uid=2000, gid=2000)を作成し、Ubuntu環境を構築しています:
FROM ubuntu:20.04
RUN groupadd -g 2000 test \
&& useradd -m -u 2000 -g 2000 test
USER test
この設定でビルドしたイメージを使用し、ホスト側のディレクトリにファイルを書き込もうとすると、パーミッションエラーが発生してしまいます。
docker build -t ubuntu:test1 .
docker run --rm -v $(pwd):/tmp/v ubuntu:test1 \
bash -c "echo echo_test1_contents > /tmp/v/echo_test1"
これは、Dockerコンテナ内のユーザー(uid=2000, gid=2000)が、ホスト側のディレクトリに対して書き込み権限を持っていないためです。
どうすればいいの
この問題を解決するために、よしなにDockerfileを修正します。
ARG命令を使用してホスト側のuid, gidを受け取り、それに基づいてコンテナ内のユーザーを設定します。
FROM ubuntu:20.04
ARG UID=2000
ARG GID=2000
RUN groupadd -g $GID test \
&& useradd -m -u $UID -g $GID test
USER test
ビルド時に次のように指定することで、ホストとコンテナのuid, gidを一致させています
コードをコピーする
docker build -t ubuntu:test2 \
--build-arg UID=$(id -u) --build-arg GID=$(id -g) .
これにより、ホスト側でのファイル操作とコンテナ内での操作が一貫して行えるようになります。
さいごに
そもそも権限が付与できないケースも稀にあり、そもそも書き込みを行う処理は本当に必要かどうかを考えてみるのも選択肢の一つかもしれません。
必要がないのであれば可能な限り書き込み処理を排除したほうがいいですしね。
変更しても反映されないときには--build
オプションを試してみるとしあわせになれるかもしれません。
それでは。