Slide 1

Slide 1 text

Dockerfileチョットカケルになろう

Slide 2

Slide 2 text

目次 1. Docker 2. Dockerfileのおまじない 3. マルチステージビルド 4. RUN --mount=... 5. Dockerのキャッシュ 6. hadolint 7. まとめ 8. 補足

Slide 3

Slide 3 text

Docker ● コンテナ ○ 軽量性、可搬性が推しらしい ■ OSや環境に依存せずどんな場所でも同じように動くアプリケーションを作れる ■ 作ったり壊したりしやすいので破壊的な検証も行いやすい ● ランタイムのアップグレード(Node.js 18.x→20.x)等

Slide 4

Slide 4 text

Docker ● コンテナ化は当たり前 ○ Docker Compose ○ Amazon ECS ○ Cloud Run ○ k8s(EKS,GKE...)

Slide 5

Slide 5 text

Docker ● Dockerfileはコンテナイメージのレシピ ○ レシピが良いと誰がどこで作っても良いコンテナが出来上がる ■ だからDockerfileはこだわっておきたい

Slide 6

Slide 6 text

Dockerfileのおまじない ● # syntax=docker/dockerfile:1 ○ https://docs.docker.com/reference/dockerfile/#syntax ● 新しいお作法を使いまっせ、と宣言 ○ Docker BuildKitが有効になってる場合のみ利用できる ■ Docker BuildKit:Docker 18.09~利用可能

Slide 7

Slide 7 text

マルチステージビルド ● 1つのDockerfileの中に複数のFROM句が存在 ○ COPY --from=...もマルチステージビルド ● 最終的なイメージに必要なリソースだけを詰める ○ アプリケーションが実行できればOK ■ コンパイル言語の場合、ビルド済みのバイナリのみ! ○ 別に最終イメージ用に限らず自由にステージ定義できる ■ 例)本番、開発環境で同じ依存関係用baseステージ作っておいてCOPY --from=base

Slide 8

Slide 8 text

RUN --mount=... ● 種類(参考) ○ --mount=type=bind ○ --mount=type=cache ○ --mount=type=secret ● --mount=type=bind ○ ビルドコンテキスト内のリソースをレイヤーに書き込まず利用できる ■ 例)package*.json、go.{mod,sum}、composer.*等をCOPYしなくて良い ● --mount=type=cache ○ 差分更新だけになるのでコマンド実行が早くなる ■ RUN --mount=type=cache,target=/root/.npm \ NODE_ENV=production \ npm i ○ 同じディレクトリであればレイヤーをまたいだキャッシュが使える ● --mount=type=secret(参考) ○ RUNで実行するコマンドで秘匿情報が必要な場合にイメージに書き込まずに注入できる ■ 例)ビルド時にシークレットキーが必要な場合 ○ ARG→ENVのパターンを秘匿情報で使わない!

Slide 9

Slide 9 text

Dockerのキャッシュ ● Docker BuildKitのキャッシュ ○ さっきのRUN --mount=type=cache ● Dockerのレイヤーキャッシュ ○ COPY、RUN等の記述順を変える ○ マルチステージビルド ○ ビルドコンテキストに不要なリソースが入らないようにしとく ■ .dockerignore ● .gitignoreとは挙動が違うので注意 ● CI/CD上のキャッシュ ○ GitHub Actionsの場合はgha使っておけばとりあえずOK

Slide 10

Slide 10 text

ベストプラクティス多くて網羅できない問題...

Slide 11

Slide 11 text

ベストプラクティス多くて網羅できない問題... ↓ hadolint!

Slide 12

Slide 12 text

hadolint ● Haskell Dockerfile Linter ● 使い方 ○ $ hadolint path/to/Dockerfile ■ CI/CDでも導入が簡単 ● 良しなにルールを削ったり設定変えれる ○ チーム開発ではプロジェクトルートに.hadolint.yamlを置いとく ○ ルールはWikiにまとまってる

Slide 13

Slide 13 text

まとめ ● コンテナ化は当たり前 ● Dockerfileの先頭におまじないを入れよう ○ # syntax=docker/dockerfile:1 ● マルチステージビルドを使おう ○ 1つのDockerfile内にFROMが複数 or COPY --from=... ● RUN --mount=...を使おう ○ --mount=type=bind ○ --mount=type=cache ○ --mount=type=secret ● Dockerのキャッシュを使おう ● hadolintを使おう

Slide 14

Slide 14 text

参考 ● Docker 公式ドキュメント ● 2024年版のDockerfileの考え方&書き方 ● 2021〜22年頃のDockerfile事情 ● Docker のキャッシュを全力で使いこなそう ● Docker BuildKitを理解する

Slide 15

Slide 15 text

補足 ● ADD句の使い道 ○ リモートからファイルを持ってきたい時 ■ 例)GitHub等からバイナリを持ってきたい ○ 持ってくるリソースが圧縮されてたら自動で解凍してくれる

Slide 16

Slide 16 text

補足 ● ADD句の使い道 ○

Slide 17

Slide 17 text

補足 ● docker-composeじゃなくてdocker compose使おう ● COPY --chown使おう