Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Dockerfileチョットカケルになろう/dockerfile-next-steps
Search
aono
October 12, 2024
Programming
82
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
210
Other Decks in Programming
See All in Programming
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
260
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
250
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
390
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
300
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
520
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
330
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
370
Java 27新機能 / Java 27 new features
kishida
2
190
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
140
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
130
iOSDC2026登壇資料.pdf
riofujimon
0
200
mrbgem 三角測量 開発
ogom
0
180
Featured
See All Featured
Building Adaptive Systems
keathley
44
3.2k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
GitHub's CSS Performance
jonrohan
1033
470k
How GitHub (no longer) Works
holman
316
150k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
470
How to Think Like a Performance Engineer
csswizardry
28
2.9k
Six Lessons from altMBA
skipperchong
29
4.5k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Being A Developer After 40
akosma
91
590k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
310
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使おう