はじめに
ボリュームを使用する際、マウント先のフォルダがrootユーザーで作成されてしまって困りました。知識不足のため、なかなか解消できませんでした。メモとして残しておきます。
状況の確認
version: '3.7'
services:
web-back:
build:
context: ./backend/web-back
args:
- UID=${UID:-1000}
- GID=${GID:-1000}
- USERNAME=user
- GROUPNAME=user
volumes:
- ./backend/web-back:/code
- static_volume:/code/staticfiles
volumes:
static_volume:
FROM python:3.11
WORKDIR /code
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}
ボリュームとしてstatic_volume
を設定し、code/staticfiles
にマウントします。./backend/web-back
は空のディレクトリです。rootユーザー回避のため、user
という一般ユーザーとして実行できるようにしています。
ここからコンテナを立ち上げると、指定したディレクトリが存在していないのでstaticfiles
ディレクトリが作られますが、パーミッションがrootになってしまいます。他のパーミッションと食い違ってしまい問題の元になるので、user
に揃えていきます。
先にディレクトリ作っておけばいい!
結論から言うと、statifiles
を事前に一般ユーザーで作っておけば、この問題を回避できます。Dockerfileに以下のように追記します。
FROM python:3.11
WORKDIR /code
ARG UID
ARG GID
ARG USERNAME
ARG GROUPNAME
RUN groupadd -g ${GID} ${GROUPNAME} -f && \
useradd -m -s /bin/bash -u ${UID} -g ${GID} ${USERNAME}
RUN mkdir staticfiles && \ #追記
chown ${USERNAME}:${GROUPNAME} staticfiles #追記
USER ${USERNAME}
staticfiles
を作ったあと、chown
でパーミッションを変更することで、非root権限を付与できます。作られたディレクトリをマウントすることになるので、そのパーミッションは保持されたままになるということですね。
おわりに
先にディレクトリ作っておけばパーミッションいじっておけばええんや!というのを見て、「え、それでいいの?」って感じになりました。言われればたったそれだけって感じですが、自分じゃ気づかないなぁ…。