dockerコンテナを使ってローカルで開発作業をするとき、local側のディレクトリとコンテナ側のディレクトリを共有してコンテナ側で生成されるファイルを永続化したりする事がある。
このとき、コンテナ側で生成されたファイルがroot権限で作成されたりするとlocal側での取り扱いがめんどくさい。(sudoしないとファイルを削除できなかったり)
ローカル側のUID, GIDとコンテナ側でのUID, GIDを揃えられるようにDockerfileやdocker-composeを用意しておくと、このあたりがスムーズに行くようになる。
#Dockerfile FROM ubuntu:20.04 ARG USERNAME=app ARG GROUPNAME=app ARG UID=1000 ARG GID=1000 RUN groupadd -g $GID $GROUPNAME && \ useradd -m -s /bin/bash -u $UID -g $GID $USERNAME USER $USERNAME WORKDIR /home/$USERNAME/
これで
$ docker build . --build-arg UID="`id -u`" --build-arg GID="`id -g`"
でローカルのUID, GIDでコンテナ側のユーザーを作成し揃えることができる。
僕はdocker-composeを使いたいので以下の感じで書いて
# docker-compose.yml version: '3' services: app: build: context: . args: UID:1000 GID:1000 USERNAME:app GROUPNAME:app volumes: - ./data:/home/app
以下の感じで実行する
docker-compose build --build-arg UID="`id -u`" --build-arg GID="`id -g`"
さらに毎回上記コマンドを打つのがめんどくさいのでmakefileに
# makefile build_image: bash -c 'docker-compose build --build-arg UID="`id -u`" --build-arg GID="`id -g`"'
と書いておき、
make build_image
でビルドする。
※bash -c を書いているのは僕がfishを使っているため。こういうのがあるからやっぱりPOSIX互換のshellを使うようにしたほうがいいのかなぁと最近は思い始めた。