@@ -38,14 +38,23 @@ COPY --from=builder /app/db/migrations ./db/migrations
3838COPY --from=builder /app/scripts/migrate.mjs ./scripts/migrate.mjs
3939# 写真とエクスポートの置き場。実運用ではホストのディレクトリを bind マウントするが、
4040# マウントせずに動かしたときも非 root で書けるように用意しておく
41- RUN mkdir -p /app/photos /app/exports && chown -R node:node /app/photos /app/exports /app/.next
41+ # 実行ユーザーは **ホストに実在しない uid 10001**。node イメージが持つ node ユーザーは
42+ # uid 1000 = ホストの1人目のユーザーの番号で、それで動かすと万一コンテナから
43+ # 抜け出されたときにそのユーザーのファイルを触れる立場になる。10001 ならホストの
44+ # 誰でもなく、chown で渡した data/ しか触れない
45+ RUN addgroup -g 10001 app && adduser -S -D -G app -u 10001 -h /home/app app \
46+ && mkdir -p /app/photos /app/exports \
47+ && chown -R 10001:10001 /app/photos /app/exports /app/.next /home/app \
48+ && chmod 1777 /home/app
4249# 待ち受けポート。standaloneのserver.jsはPORT環境変数を読む(next dev/start側は
4350# package.jsonのscriptsで-p 7040を指定していて、ここと両方を揃えて変えること)
4451ENV PORT=7040
4552EXPOSE 7040
46- # root で動かさない。node:24-alpine が持つ node ユーザーは uid/gid とも 1000 で、
47- # compose の user: の既定 (1000:1000) と一致する
48- USER node
53+ # root で動かさない。compose の user: の既定 (10001:10001) と一致する。
54+ # HOME を 1777 で用意してあるのは、`.env` で別の uid を指定されたときに
55+ # /etc/passwd に載らないユーザーになり、HOME が / に落ちて書けなくなるため
56+ ENV HOME=/home/app
57+ USER 10001:10001
4958# マイグレーションが失敗したら待ち受けに進まない(古いスキーマのままアプリが動くのを
5059# 防ぐ)。exec で server.js を PID 1 にして、シグナルがそのまま届くようにする
5160CMD ["sh" , "-c" , "node scripts/migrate.mjs && exec node server.js" ]
0 commit comments