【Docker】複数のイメージを元にしてイメージを定義する

 Dockerでは次の様に既存イメージを元にイメージの定義ファイル(以下Dockerfile)を作れます。

FROM php:7.3-fpm-alpine
# php:7.3-fpm-alpineの内容を引き継いでimageを定義する
# @see https://github.com/docker-library/php/tree/b6fd2f70018163227f0f18f3ba1fa4d70e6d929e

 時折、複数の外部イメージを元にしたDockerfileを作るべき時があります(既存サーバの再現など)。複数の外部イメージの内容を詰め込んだDokcerfileは次の様に作れます。

FROM php:7.3-fpm-alpine

# nginxのコピー
COPY --from=nginx:latest /etc/nginx /etc/nginx
COPY --from=nginx:latest /usr/sbin/nginx /usr/sbin/nginx
# composerのコピー
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

 COPYコマンドはファイルやディレクトリをコピーするコマンドです。大体、マウントしない予定のローカルの設定ファイル等を初期配置する時に用います。
Dockerfile リファレンス — Docker-docs-ja 17.06 ドキュメント#COPY
 このCOPYコマンドのfromオプションが重要です。

オプションとして COPY にはフラグ –from= があります。 これは実行済のビルド・ステージ( FROM .. AS により生成)におけるソース・ディレクトリを設定するものです。 これがあると、ユーザーが指定したビルド・コンテキストのかわりに、設定されたディレクトリが用いられます。 このフラグは数値インデックスを指定することも可能です。 この数値インデックスは、FROM 命令から始まる実行済のビルド・ステージすべてに割り当てられている値です。 指定されたビルド・ステージがその名前では見つけられなかった場合、指定された数値によって見つけ出します。
Dockerfile リファレンス — Docker-docs-ja 17.06 ドキュメント#COPY

 このfromオプションを使うと次の様に複数のイメージ間処理を飛び飛びで行えます。
マルチステージビルドの利用 | Docker ドキュメント
Builder pattern vs. Multi-stage builds in Docker

## 無名パターン
# GO言語について色々
FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

# GO言語についての色々を横に置いて、alpineを元に色々始める
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
# 一つ前のFROMから始めて作っていたイメージが 0 に割り当てられます
# GO言語について色々したイメージからコピー
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]


##############################################################
## 名付けパターン
FROM golang:1.7.3 AS builder # builderと命名
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go    .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
# 命名したbuilderのイメージからコピー
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]

 少々直感的でないですが(特に0に割り当てとFROMの切り替えのあたり)複雑なイメージをまとめるなら冒頭のコードよりもこちらを使うことになるでしょう。この複数のイメージを使う機能を簡略化して外部イメージを扱ったのが冒頭です。

FROM php:7.3-fpm-alpine

# nginxのコピー
# nginx:latest のイメージの中のファイル(nginx本体をコピー)
# @see https://github.com/docker-library/docs/tree/master/nginx
COPY --from=nginx:latest /etc/nginx /etc/nginx
COPY --from=nginx:latest /usr/sbin/nginx /usr/sbin/nginx
# composer:latest のイメージの中のファイル(composer本体をコピー)
# @see https://github.com/composer/docker
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

 元イメージのどのディレクトリに目当てのものがあるかを把握する必要こそありますが、プレーンな状態から手書きで各アプリをインストールするようにするより随分楽できます。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG