web-dev-qa-db-ja.com

複数のベースイメージを使用してDockerイメージを構築する方法

基本的なDockerイメージ(openjdk)を使用して、単純なJava Programme。

しかし、私はdockerファイルで2つの基本イメージを使用するかどうか疑問に思っていました。どうすればそれができますか?私はドッカーが次のようなものをサポートしているとは思いません:

FROM dockerImaage1
FROM dockerImage2

シナリオの1つ、これが必要な理由は、ubuntuのイメージがopenjdkであることです。そのため、ubuntuの基本イメージとin dockerファイルの書き込み命令を使用してopenjdkをインストールします、Java_HOME変数などを設定します。これは間違いなく面倒です。

別の方法として、ubuntuのベース内でopenjdkのベースイメージを使用することもできます(可能な場合)。

より典型的なケースがあるかもしれませんが、私たちが必要とする可能性があるのは、機能がひどく酷いことです。

SODockerファイルで2つの基本イメージを使用する方法についてのアイデア?誰かそれをまだ行ったことがありますか?

リバースエンジニアリングのリンクを見つけました here ですが、ubuntuのdockerファイルでADDやCOPYなどのコマンドを使用するとリバースエンジニアリングが失敗するなど、いくつかの制限があります。

Dockerの最新バージョンには、マルチステージビルドの概念があります。参照:( https://docs.docker.com/engine/userguide/eng-image/multistage-build/

マルチステージビルドでは、Dockerfileで複数のFROMステートメントを使用します。各FROM命令は異なるベースを使用でき、それぞれがビルドの新しいステージを開始します。あるステージから別のステージにアーティファクトを選択的にコピーして、最終的なイメージに不要なものを残しておくことができます。

9
user2019864

答えはいいえだ。 Mobyの問題の詳細な説明を参照してください Dockerfileを使用して複数のイメージを1つに結合する方法

コンテナの背後にある考え方は、実際の構成の最小単位はコンテナであるということです。一般に、複数の画像を1つの画像にマージすると、いくつかの問題が発生する可能性があります。たとえば、ライブラリまたはライブラリのバージョンで異なるイメージが競合しています。

6
CloudStax

簡単に?いいえ。複数のLinuxルートファイルシステムを効果的に組み合わせるため、Dockerはこれをサポートしていません。

これを行う最も簡単な方法は、Ubuntuから開始してopenjdkをインストールするか、すでにそうしているdockerハブでイメージを見つけることです。

3
tcnj