わかりやすくするために、ベースイメージとは、すべての一般的な構成を持つ親イメージを意味します。これにより、それに基づいて子が依存関係を個別にダウンロードする必要がなくなります。
私の理解では、docker-compose.ymlファイルはランタイム構成であり、Dockerfilesはビルド時構成です。ただし、docker-composeを使用するbuild
オプションがあり、これを使用してベースイメージを構築する方法を知りたいと思っていました。
現在、私は他のシェルスクリプトを実行するシェルスクリプトを使用しています。自分が作成したベースイメージから、すべてのイメージを構築します。もう1つは、必要な構成を備えたコンテナーとしてそれらを実行します。ただし、ベースイメージはコンテナとして実行されることはありません。
現在、私がdocker-composeファイルに変更したいシェルスクリプトは次のようになります:
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
私の質問は1つにまとめられます。Docker-composeを使用してコンテナーで実行することなく、このベースイメージを作成できますか。 (すべてのDockerfileは、ベース自体以外はFROM base:latest
で始まります)。他の人ができる限り簡単にできるようにして、1つのコマンドを実行するだけで済むようにしています。
編集:私はバージョン3を使用しており、ドキュメントによれば、build:
は無視され、docker-composeは事前に作成されたイメージのみを受け入れます。
ドキュメントによると、サービスのbuild
オプションは、有名な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
は頻繁に変更されることはないため、docker composeコマンドを実行するたびにビルドする必要はありませんです。
はい、そうです。次のように使用します。
version: '2'
services:
wls-admin:
container_name: wls-admin
image: weblogic-domain
build:
context: wls-admin
args:
- ADMIN_PORT=${WLS_ADMIN_PORT}
- CLUSTER_NAME=${WLS_CLUSTER_NAME}
- PRODUCTION_MODE=dev
networks:
- wls-network
ここでimage
句を指定すると、docker-compose build
がこのサービスのweblogic-domain
という名前のDockerイメージを生成します。このイメージは、同じビルドプロセスでも、他のサービスのDockerfileで再利用できます。
画像を作成するシェルスクリプトから、異なるディレクトリに異なるdockerfilesがあることがわかります。これを使用してdocker-compose.ymlファイルを作成できます。 build 設定は、Dockerにイメージをビルドする方法を伝えるために使用されます。
これらのdockerfileは、次の方法で作成ファイルで使用できます。
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
を使用しても、それぞれにネットワークを指定する必要はありません。