web-dev-qa-db-ja.com

ベースイメージを構築するDocker-compose.ymlファイル、次にそれに基づいて子?

わかりやすくするために、ベースイメージとは、すべての一般的な構成を持つ親イメージを意味します。これにより、それに基づいて子が依存関係を個別にダウンロードする必要がなくなります。

私の理解では、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は事前に作成されたイメージのみを受け入れます。

12
Will Parzybok

ドキュメントによると、サービスの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コマンドを実行するたびにビルドする必要はありませんです。

3
vedarthk

はい、そうです。次のように使用します。

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で再利用できます。

7
Adonai

画像を作成するシェルスクリプトから、異なるディレクトリに異なる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を使用しても、それぞれにネットワークを指定する必要はありません。

1
Ayushya