Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dockerfileチョットカケルになろう/dockerfile-next-steps
Search
aono
October 12, 2024
Programming
69
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Dockerfileチョットカケルになろう/dockerfile-next-steps
aono
October 12, 2024
More Decks by aono
See All by aono
RDB(ぽすぐれ)チューニング入門/rdb-tuning-introduction-for-postgresql
awonosuke
0
150
Other Decks in Programming
See All in Programming
今さら聞けないCancellationToken
htkym
0
220
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
170
dRuby over BLE
makicamel
2
320
AIで効率化できた業務・日常
ochtum
0
110
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
280
GitHub Copilot CLIのいいところ
htkym
2
1.3k
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
1.8k
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
17
6.2k
Agentic UI
manfredsteyer
PRO
0
110
The NotImplementedError Problem in Ruby
koic
1
650
OSもどきOS
arkw
0
470
A2UI という光を覗いてみる
satohjohn
1
110
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
Leo the Paperboy
mayatellez
7
1.8k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
380
It's Worth the Effort
3n
188
29k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
570
GraphQLとの向き合い方2022年版
quramy
50
15k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
200
Believing is Seeing
oripsolob
1
140
Transcript
Dockerfileチョットカケルになろう
目次 1. Docker 2. Dockerfileのおまじない 3. マルチステージビルド 4. RUN --mount=...
5. Dockerのキャッシュ 6. hadolint 7. まとめ 8. 補足
Docker • コンテナ ◦ 軽量性、可搬性が推しらしい ▪ OSや環境に依存せずどんな場所でも同じように動くアプリケーションを作れる ▪ 作ったり壊したりしやすいので破壊的な検証も行いやすい •
ランタイムのアップグレード(Node.js 18.x→20.x)等
Docker • コンテナ化は当たり前 ◦ Docker Compose ◦ Amazon ECS ◦
Cloud Run ◦ k8s(EKS,GKE...)
Docker • Dockerfileはコンテナイメージのレシピ ◦ レシピが良いと誰がどこで作っても良いコンテナが出来上がる ▪ だからDockerfileはこだわっておきたい
Dockerfileのおまじない • # syntax=docker/dockerfile:1 ◦ https://docs.docker.com/reference/dockerfile/#syntax • 新しいお作法を使いまっせ、と宣言 ◦ Docker
BuildKitが有効になってる場合のみ利用できる ▪ Docker BuildKit:Docker 18.09~利用可能
マルチステージビルド • 1つのDockerfileの中に複数のFROM句が存在 ◦ COPY --from=...もマルチステージビルド • 最終的なイメージに必要なリソースだけを詰める ◦ アプリケーションが実行できればOK
▪ コンパイル言語の場合、ビルド済みのバイナリのみ! ◦ 別に最終イメージ用に限らず自由にステージ定義できる ▪ 例)本番、開発環境で同じ依存関係用baseステージ作っておいてCOPY --from=base
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のパターンを秘匿情報で使わない!
Dockerのキャッシュ • Docker BuildKitのキャッシュ ◦ さっきのRUN --mount=type=cache • Dockerのレイヤーキャッシュ ◦
COPY、RUN等の記述順を変える ◦ マルチステージビルド ◦ ビルドコンテキストに不要なリソースが入らないようにしとく ▪ .dockerignore • .gitignoreとは挙動が違うので注意 • CI/CD上のキャッシュ ◦ GitHub Actionsの場合はgha使っておけばとりあえずOK
ベストプラクティス多くて網羅できない問題...
ベストプラクティス多くて網羅できない問題... ↓ hadolint!
hadolint • Haskell Dockerfile Linter • 使い方 ◦ $ hadolint
path/to/Dockerfile ▪ CI/CDでも導入が簡単 • 良しなにルールを削ったり設定変えれる ◦ チーム開発ではプロジェクトルートに.hadolint.yamlを置いとく ◦ ルールはWikiにまとまってる
まとめ • コンテナ化は当たり前 • Dockerfileの先頭におまじないを入れよう ◦ # syntax=docker/dockerfile:1 • マルチステージビルドを使おう
◦ 1つのDockerfile内にFROMが複数 or COPY --from=... • RUN --mount=...を使おう ◦ --mount=type=bind ◦ --mount=type=cache ◦ --mount=type=secret • Dockerのキャッシュを使おう • hadolintを使おう
参考 • Docker 公式ドキュメント • 2024年版のDockerfileの考え方&書き方 • 2021〜22年頃のDockerfile事情 • Docker
のキャッシュを全力で使いこなそう • Docker BuildKitを理解する
補足 • ADD句の使い道 ◦ リモートからファイルを持ってきたい時 ▪ 例)GitHub等からバイナリを持ってきたい ◦ 持ってくるリソースが圧縮されてたら自動で解凍してくれる
補足 • ADD句の使い道 ◦
補足 • docker-composeじゃなくてdocker compose使おう • COPY --chown使おう