WSL(Linux)のdocker-composeのコンテナを非rootユーザーで実行するには

WSL(Linux)のdocker-composeのコンテナを非rootユーザーで実行するには

dockerコンテナ

dockerコンテナ内に入ると、通常rootユーザーになります。
コンテナ内で作成したファイルやコマンドによって作られたファイルの所有者はrootとなります。

何がまずいかというと、コンテナから出てホストの一般権限のユーザーでファイルにアクセスしようとすると、root権限がないためpermission errorとなり、変更・削除が出来ません。

解決方法

原因は、ファイルの所有者がホストのユーザーと異なるユーザー(root)になっているため権限がないことによります。
コンテナを実行するユーザーをrootではなくWSL上のユーザーと同じIDの一般ユーザーで実行することで解決します。

WSL上のユーザー情報を確認する

ターミナル上でidを実行して、uid, gidを確認します。

dockerfileでユーザーを作成

通常コンテナにはrootユーザーしかいないため、コンテナ生成時にWSL上のユーザーと同じuid, gidで一般ユーザーを作成します。
最後に作成したユーザーでコンテナを実行することで、コンテナ内で作成するファイルはWSLのユーザーと同じ所有者となります。

dockerfile

# ユーザーIDをセット
ARG UID=1000
# グループIDをセット
ARG GID=1000
# コンテナ内に名称dockerでグループを作成
RUN groupadd -g ${GID} docker
# コンテナ内に名称dockerでdockerグループに所属するユーザーを作成
RUN useradd -u ${UID} -g ${GID} -s /bin/bash -m docker
# コンテナを実行するユーザーを指定
USER ${UID}

docker-composeを使っている場合

buildのarg引数として、.envで定義してある環境変数のUID, GIDをdockerfileへ引き渡します。
不特定多数やチームで共有してdockerfileを使用する場合、実行ユーザーによって変わるUIDやGIDをdockerfileへハードコーディングせずに済みます。

.env

UID=1000
GID=1000

docker-compose.yml

services:
  php:
    build:
      context: ./docker/php
      args:
        - UID=${UID}
        - GID=${GID}

プログラミングカテゴリの最新記事