Docker4 択難易度 標準

状況

イメージを公開レジストリに push する前の確認。リポジトリ直下に本番 DB のパスワード入りの .env がある。.gitignore には .env を書き、.dockerignore には node_modules だけ書いてある。

push の前に止めるべき点は?

FROM node:22-slimWORKDIR /appCOPY . .RUN npm ci --omit=devCMD ["node", "server.js"]

正答

  1. ビルドは .gitignore を見ない。.env がイメージに入るので .dockerignore に足す
  2. COPY . . の前に package.json だけ COPY しないと、ビルドキャッシュが効かない
  3. node:22-slim ではなく node:22 を使わないと、npm ci が失敗する
  4. 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

dockerignoreenv-filesecret

この問題を含む Docker のテストを制限時間つきで解く

Dockerクイズへ