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