2017-07-18 5 views
1

明確にするために、私が基本イメージと言うとき、それはすべての共通の構成を持つ親イメージを意味するので、それに基づく子は依存関係を個別にダウンロードする必要はありません。Docker-compose.ymlファイルはベースイメージを作成し、それに基づいて子供を作成しますか?

Docker-compose.ymlファイルは実行時設定ですが、Dockerfilesはビルド時の設定です。ただし、docker-composeを使用しているbuildオプションがあり、これを使用して基本イメージを構築する方法を知りました。

今のところ、私は他のシェルスクリプトを実行するシェルスクリプトを使用しています。私は自分のイメージを作成したベースイメージから構築します。もう一方は必要な設定でコンテナとして実行します。ただし、基本イメージはコンテナとして実行されることはありません。

現在、私はそうのように見える、ドッキングウィンドウ・コンファイルに変更したいと考えていますシェルスクリプト:次のように

echo "Creating docker network net1" 
docker network create net1 

echo "Running api as a container with port 5000 exposed on net1" 
docker run --name api_cntr --net net1 -d -p 5000:5000 api_img 

echo "Running redis service with port 6379 exposed on net1" 
docker run --name message_service --net net1 -p 6379:6379 -d redis 

echo "Running celery worker on net1" 
docker run --name celery_worker1 --net net1 -d celery_worker_img 

echo "Running flower HUD on net1 with port 5555 exposed" 
docker run --name flower_hud --net net1 -d -p 5555:5555 flower_hud_img 

画像を作るシェルスクリプトは、次のとおりです。

echo "Building Base Image" 
docker build -t base ../base-image 

echo "Building api image from Dockerfile" 
docker build -t api_img ../api 

echo "Building celery worker image" 
docker build -t celery_worker_img ../celery-worker 

echo "Building celery worker HUD" 
docker build -t flower_hud_img ../flower-hud 

私の質問あるものになると、ドッカーの作成でコンテナ内でこの基本イメージを実行することなくこのベースイメージを作成できますか? (すべてのDockerファイルは、ベース自体以外のFROM base:latestで始まります)。私はできるだけ簡単に他の人に見せたいので、1つのコマンドを実行するだけです。

編集:私はバージョン3を使用しており、ドキュメントによればbuild:は無視され、ドッカー作成は事前構築されたイメージのみを受け入れます。

答えて

2

ドキュメントごとに、サービスのオプションは、有名なDockerfileを含む引数としてディレクトリをとります。基本イメージを構築し、実際のサービスイメージを構築する方法はありません。

Dockerは、アプリケーションが動作する環境です。基本イメージを作成するときには、頻繁に変更されないものが必要です。次に、baseiamgeを一度構築してリポジトリにアップロードし、DockerfileにFROM baseimage:latestを使用する必要があります。あなたはPythonアプリケーションを構築する場合

たとえば、あなたのpythonからそれを作成してインストールすることができ要件:ここ

FROM python:3.6 
COPY requirements.txt . 
RUN pip install -r requirements.txt 

は、python:3.6は頻繁に変更するつもりはないベースイメージであるため、次のものが必要ドッカーの作成コマンドを実行するたびにビルドしないでください

+0

最初にベースイメージを作成し、別のコマンドでドッカーを作成して、1つのコマンドを実行する場合はシェルスクリプトを実行してください。 –

+1

@WillParzybokそれは良いアイデアとあなたの目的に適しているようです。 – Ayushya

+0

それは私がしていることです。ジェンキンスは自分のベースイメージを作成し、それをプライベートイメージリポに入れます。バージョン番号で正しくタグ付けすると、常にコントロールが得られます。対処するのはかなり単純なプロセスです。 – Grimmy

0

イメージを作成するシェルスクリプトから、異なるディレクトリに異なるdockerfilesがあることがわかります。これを使ってdocker-compose.ymlファイルを作成することができます。 buildの設定は、ドッカーにイメージの構築方法を伝えるために使用されます。

あなたは、このようにあなたのコンポーズファイルでこれらのdockerfilesを使用することができます。ここでは

version: '3' 
services: 

    api_cntr: 
    image: api_img 
    build: 
     context: ./api 
    container_name:api_cntr 
    ports: 
     - 5000:5000 

、私はあなたのdocker-compose.ymlファイルもbase-imageというディレクトリが含まれているフォルダに配置されていることを前提としています。 base-imageは画像を構築するために使用されるdockerfileを持っています。

これはあなたのサービスの1つの構造にすることができます。同様の方法で、他のサービスも作成できます。また、docker-composeを利用している間に、docker-compose.ymlファイル内で宣言されたすべてのサービスが隔離されたネットワークの一部であるため、ネットワークごとにネットワークを指定する必要はありません。

+0

質問に誤解がありましたか? – Ayushya

+0

多少、それはおそらく言葉の貧弱さに対する私のせいです。 base-imageディレクトリには、 '' 'base'''というイメージを作成するDockerfileが含まれています。他のすべてのコンテナは、 '' 'FROM''の文でこのベースを参照する独自のDockerfileを持つ独自のディレクトリを持っています。言い換えれば、ベース自体はコンテナとして実行されることはなく、代わりに他のすべてのイメージのためのあらかじめ構築されたベースです。 –

+0

@ayushyaあなたの作成ファイルは 'base-image'ディレクトリを使用します。イメージを構築し、' api_img'としてタグ付けするコンテキストです。 @WillParzybokが望むのは、コンポーズファイル内のサービスを起動するたびにベースイメージを構築することです。 – vedarthk

関連する問題