dockerコンテナはデフォルトではrootで実行される。
そのため、コンテナ内でファイル生成したりすると、ホスト側の非rootユーザから削除できないなどの問題が起こる。
そもそもrootが必要無いのなら、dockerコンテナ内のユーザは非rootにしておいたほうが良い。
(ちなみに、macではこのファイルのパーミッション問題は起きない。)
Dockerfile
# ビルド引数としてUIDを受け取る
ARG USER_UID
# 必要な設定等
RUN apt update -y
…
# コンテナ用の非rootユーザーを作成
RUN useradd -u $USER_UID myuser
USER myuser
WORKDIR /work
Dockerfileではコンテナ用の非rootユーザを作成し、そのユーザでコンテナ実行されるようにすればよい。ビルド引数としてuidを受け取れるようにしておく。
docker-compose.yml
build:
context: ..
dockerfile: ./docker/Dockerfile
args:
USER_UID: ${USER_UID}
volumes:
- ..:/work
USER_UIDをuidとしてビルド引数に設定
# コンテナ起動前の下準備等
…
# imageのビルドが発生する時用。
# コンテナ内のユーザのUIDをホストマシンと合わせることで
# コンテナ・ホストマシン間でのpermission問題に対処
USER_UID=$(id -u)
export USER_UID
# コンテナを起動し、コンテナ内でなんらかの処理
cd "${work_dir}"/docker
docker-compose run —rm
hoge-service /bin/
bash -c “
hoge/fuga.sh $num”
# コンテナ実行後の後処理等
…
imageのビルド時にコンテナ内のユーザのUIDが決まるので、ビルドされたimage自体のポータビリティは低下する。
しかし、imageを複数のマシンで使用したい場合は、コンテナを実行したいマシン上でimageをビルドすれば良い。
上記に示した例で、ローカルのmacとLinuxサーバ両方でコンテナが問題なく動作し非root権限でもコンテナ内で生成したファイルを削除できることを確認済み