1. ホーム
  2. docker

[解決済み] Dockerイメージを1つのコンテナにまとめる方法はありますか?

2022-02-10 20:49:29

質問

今、いくつかのDockerfilesを持っています。

1つはCassandra 3.5用で、これは FROM cassandra:3.5

Kafka用のDockerfileもありますが、こちらはかなり複雑です。それは FROM java:openjdk-8-fre で、KafkaとZookeeperをインストールするための長いコマンドを実行します。

最後に、SBTを使用するScalaで書かれたアプリケーションを紹介します。

そのDockerfileに対して FROM broadinstitute/scala-baseimage これで、Java 8、Scala 2.11.7、STB 0.13.9が手に入りました。

おそらく、私はDockerの仕組みを理解していませんが、私のScalaプログラムにはCassandraとKafkaが依存関係にあり、開発目的のために、他の人が私のレポを単に Dockerfile そして、Cassandra、Kafka、Scala、Java、SBTがすべて組み込まれた状態でビルドできるようにすれば、ソースをコンパイルするだけでよいのです。しかし、これには多くの問題があります。

これらのDockerfileをどのように組み合わせればよいのでしょうか?また、それらを組み込んだ環境を簡単に作るにはどうしたらよいでしょうか?

どのように解決するのですか?

を使用することができます。 マルチステージビルド Docker 1.17で導入された機能

これを見てください。

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 .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]  

その後、普通に画像を構築してください。

docker build -t alexellis2/href-counter:latest

から。 https://docs.docker.com/develop/develop-images/multistage-build/

<ブロッククオート

最終的には、以前と同じ小さな本番用イメージになりますが、複雑さは大幅に軽減されます。中間イメージを作成する必要はなく、ローカルシステムにアーティファクトを抽出する必要も全くありません。

どのように動作するのですか?2番目のFROM命令は、alpine:latestイメージをベースにして、新しいビルドステージを開始します。COPY --from=0行は、前のステージからビルドされたアーティファクトだけをこの新しいステージにコピーします。Go SDKと中間成果物は残され、最終的なイメージには保存されません。