なんで
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