Tech系サービスやガジェットの使い心地、自分の作業環境、資産運用について気が向いたときに記録を残しています。

記事内のAmazonアソシエイト適格販売及び、Google Adsenseでお小遣いを得ています。

Docker for WSL2においてユーザー権限でコンテナを動かす

なんで

Gatsby.jsのプロジェクトをDockerで動かす際に、.cache, public/* がroot権限で作成されてしまい、コンテナの再起動や、コンテナ外からの操作が権限エラーでコケてしまう

対処法

Dockerfile でローカルユーザーを作っておく。 この方法は、UIDとGIDをハードコーディングしているため、環境によってこれらを書き変える必要がある。 他にもEntrypointのスクリプトを使ったり、/etc/passwd などをマウントする方法もあるが、docker-composeコマンドにオプションを追加せず使いたかった

# useraddがAlpine Linuxイメージにないので
RUN apk add shadow

ARG UID=1000
ARG GID=1000

# 中略

RUN useradd -m -u ${UID} -g ${GID} gensobunya
USER gensobunya

UID1000は既に存在するぞと怒られた。とりあえずUID指定せずに作ったところ、想定通りの動作はしてくれが、UIDが違うのTypesにアクセスできなかった。使っているイメージのユーザー状態を確認してみる。

~ $ cat /etc/passwd
root:x:0:0:root:/root:/bin/ash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
man:x:13:15:man:/usr/man:/sbin/nologin
postmaster:x:14:12:postmaster:/var/mail:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
at:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin
squid:x:31:31:Squid:/var/cache/squid:/sbin/nologin
xfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
cyrus:x:85:12::/usr/cyrus:/sbin/nologin
vpopmail:x:89:89::/var/vpopmail:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
smmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
node:x:1000:1000:Linux User,,,:/home/node:/bin/sh
gen:x:1001:1000::/home/gen:/bin/ash

nodeユーザーが作成されてますね… 使っているnode:version-alpineイメージで作成されているようなので、このユーザーを使ってしまおう。

マウント先が変わるので、docker-compose.yml も変更

FROM node:12.14.1-alpine

~中略~

# ユーザー権限に切り替える
USER node
WORKDIR /home/node

~~~
version: "3"
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    volumes:
      # コンテナ内にボリュームを作成する
      - /home/node/node_modules
      # プロジェクトをホームディレクトリにマウントする
      - .:/home/node
    environment:
      - NODE_ENV=development

参考

qiita.com

zukucode.com

amaya382.hatenablog.jp