dockerをインストール dockerと併せてほぼ必要になるdocker-machineやdocker-composeをインストールします。 sudo pacman -S docker docker…
目次
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}
コメントを書く