やる気がストロングZERO

やる気のストロングスタイル

ローカルとdockerコンテナ側のUID,GIDを揃える

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を使うようにしたほうがいいのかなぁと最近は思い始めた。