はじめに
「docker…めっちゃ便利やん…!」となっている初心者です。dockerを使い始めて、「rootユーザーでコンテナは立ち上げないように」というのをちらほら見かけました。ユーザー変更せずに開発していたので改めないと…と調べてたどり着いたものをまとめます。使用しているdocker-composeでの方法です。初心者の備忘録ゆえ、間違いあればご指摘嬉しいです。
Dockerfileとdocker-compose.ymlの書き方
当たり前になりますが、「ユーザーとユーザーグループをローカルIDで追加して、そのユーザーを使用する」というものです。
ARG UID
ARG GID
ARG USERNAME
ARG GROUPNAME
RUN groupadd -g ${GID} ${GROUPNAME} -f && \
useradd -m -s /bin/bash -u ${UID} -g ${GID} ${USERNAME}
USER ${USERNAME}
version: "3"
services:
web:
restart: always
build:
context: .
args:
- UID
- GID
- USERNAME=user
- GROUPNAME=user
working_dir: "/workspace/"
volumes:
- .:/workspace
bashで以下のコマンド打ち、コンテナを立ち上げて完了です。
docker-compose build --build-arg UID="$(id -u)" --build-arg GID="$(id -g)" && docker-compose up -d
groupadd -g ${GID} ${GROUPNAME} -f
でグループを、useradd -m -s /bin/bash -u ${UID} -g ${GID} ${USERNAME}
でユーザーを作成します。USER ${USERNAME}
で作ったユーザーを使用します。
ARGコマンドで変数を宣言し、同じ名前の変数をdocker-composeのargsで定義します。これでdocker-composeのbuildコマンドで、指定したIDの値をDockerfileに流し込むことができます。
コンテナを立ち上げる際は、buildコマンドのオプション--build-arg
を使いargsに書いた変数に値を入れます。ローカルのユーザーおよびグループIDと一致させたいので、${id -u}
${id -g}
で引っ張ってきます。
おわりに
ローカルのIDを自動で入れるのにどうしたら良いんだと探し始めてから、--build-arg
っていうオプションに辿り着くまで大分時間がかかりました…。あと、bashで長々としたコマンドを打たないといけないの面倒ですよね。素直にdocker-compose up --build -d
だけで出来るよう模索したけれどわかりませんでした…。
参考記事
dockerでvolumeをマウントしたときのファイルのowner問題 - Qiita
Dockerコンテナに一般ユーザーを追加するときのDockerfileの設定 - Qiita
ローカルとdockerコンテナ側のUID,GIDを揃える - やる気がストロングZERO