状況
イメージを公開レジストリに push する前の確認。リポジトリ直下に本番 DB のパスワード入りの .env がある。.gitignore には .env を書き、.dockerignore には node_modules だけ書いてある。
push の前に止めるべき点は?
FROM node:22-slimWORKDIR /appCOPY . .RUN npm ci --omit=devCMD ["node", "server.js"]正答
- ビルドは .gitignore を見ない。.env がイメージに入るので .dockerignore に足す
- COPY . . の前に package.json だけ COPY しないと、ビルドキャッシュが効かない
- node:22-slim ではなく node:22 を使わないと、
npm ciが失敗する - CMD は配列ではなく、
node server.jsと文字列で書かないと起動しない
解説
docker build に送られるビルドコンテキストから除外するファイルは .dockerignore で決まる。.gitignore はビルドでは読まれないので、.env は COPY . . でイメージの /app/.env に入り、公開レジストリに push すれば誰でも本番 DB のパスワードを取り出せる。.env や .git、鍵ファイルを .dockerignore に足し、秘密は実行時に渡す。package.json を先に COPY するのはキャッシュの改善として正しいが、漏えいに比べれば優先度は低い。slim でも npm ci は動き、CMD は配列(exec 形式)で書くのが推奨の書き方。
参考: docs.docker.com
この問題を含む Docker のテストを制限時間つきで解く
Dockerクイズへ