122

現在、いくつかの Dockerfile があります。

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 を組み合わせるにはどうすればよいですか? それらを焼き込んだ環境を簡単に作るにはどうすればよいですか?

4

8 に答える 8

26

競合が発生する可能性があるため、dockerfile を結合することはできません。やりたいことは、新しい dockerfile を作成するか、カスタム イメージを構築することです。

TL;DR; 現在の開発コンテナーに必要なすべてのツールが含まれており、機能している場合は、それをイメージとして保存し、その上でリポジトリに保存し、そのイメージからそのリポジトリからプルする dockerfile を作成します。

詳細: カスタム イメージのビルドは、パブリック イメージを使用して dockerfile を作成するよりもはるかに簡単です。これは、任意のハックや mod をイメージに格納できるためです。これを行うには、基本的な Linux イメージ (または wideinstitute/scala-baseimage) で空のコンテナーを開始し、必要なツールをインストールして、すべてが正しく機能するまで構成し、それ (コンテナー) をイメージとして保存します。このイメージから新しいコンテナーを作成し、docker-compose を使用してその上にコードをビルドできるかどうかをテストします (または、実行/ビルドしたい方法で)。それが機能する場合は、他の人がプルできるようにリポジトリにアップロードできる作業ベース イメージがあります。

パブリック イメージで dockerfile をビルドするには、dockerfile 自体にすべてのハック、モッド、およびセットアップを配置する必要があります。つまり、使用したすべてのコマンド ラインをテキスト ファイルに配置し、ハッキング、改造、セットアップをコマンド ラインに減らす必要があります。最後に、dockerfile によってイメージが自動的に作成されます。このイメージをリポジトリに保存する必要はありません。他の人に dockerfile を渡すだけで、自分の docker でイメージをスピンアップできます。

機能する dockerfile があれば、dockerfile を使用するたびに新しいイメージが作成されるため、簡単に微調整できることに注意してください。カスタム イメージを使用すると、競合のためにイメージを再構築する必要があるという問題が発生する場合があります。たとえば、機能しないツールをインストールするまで、すべてのツールが openjdk で機能します。修正にはopenjdkのアンインストールとoracleの使用が含まれる場合がありますが、インストールしたすべてのツールに対して行ったすべての構成が壊れています。

于 2016-09-21T22:14:37.287 に答える
15

次の回答は、docker 1.7 以降に適用されます。

使用したいのですが--from=NAMEfrom image as NAME なぜですか? 以上を使用できます--from=0が、dockerfile に多くの docker ステージがある場合、これを管理するのが少し難しくなる可能性があります。

サンプル例:

FROM golang:1.7.3 as backend
WORKDIR /backend
RUN go get -d -v golang.org/x/net/html  
COPY app.go .
RUN  #install some stuff, compile assets....
    
FROM golang:1.7.3 as assets
WORKDIR /assets
RUN ./getassets.sh

FROM nodejs:latest as frontend 
RUN npm install
WORKDIR /assets
COPY --from=assets /asets .
CMD ["./app"] 

FROM alpine:latest as mergedassets
WORKDIR /root/
COPY --from=frontend . /
COPY --from=backend ./backend .
CMD ["./app"]

注: dockerfile を適切に管理すると、docker イメージのビルドが大幅に高速化されます。イメージを再構築する必要がある場合に備えて、内部的に docker は docker レイヤー キャッシュを使用してこのプロセスを支援します。

于 2019-03-23T01:51:30.557 に答える
8

はい、たくさんのソフトウェアを 1 つの Docker イメージにまとめることはできます ( GitLabでは、Postgres とその他すべてを含む 1 つのイメージでこれを行います)

あなたが言うように、Cassandra と Kafka はScala アプリの依存関係であり、アプリの一部ではないため、すべてが同じイメージに属しているわけではありません。

Docker Compose を使用して多くのコンテナーを調整する必要があるため、管理レイヤーが追加されますが、柔軟性が大幅に向上します。

  • コンテナーの寿命は異なる場合があるため、デプロイするアプリの新しいバージョンがある場合は、新しいアプリ コンテナーを実行するだけでよく、依存関係を実行したままにすることができます。
  • 依存関係に異なる構成を使用して、任意の環境で同じアプリ イメージを使用できます。たとえば、開発では基本的な Kafka コンテナーを実行でき、製品ではそれを多くのノードでクラスター化できます。アプリ コンテナーは同じです。
  • 依存関係は他のアプリでも使用できます。そのため、複数のコンシューマーを異なるコンテナーで実行し、すべて同じ Kafka および Cassandra コンテナーで動作させることができます。
  • さらに、前述のすべてのスケーラビリティ、ロギングなど。
于 2016-09-21T21:43:39.553 に答える
2

Docker はイメージのマージを行いませんが、利用可能な場合は dockerfile を結合し、ビルドする必要があるファット イメージにそれらをロールインすることを妨げるものは何もありません。ただし、コンテナ内で複数のプロセスを実行することについては、ほとんどの Docker ドグマが、特にマイクロサービス アーキテクチャではあまり望ましくないと指摘する場合があります (しかし、ルールは破られるべきものですよね?)。

于 2016-09-22T19:41:47.103 に答える