Docker-compose.yml文件构建一个基本图像,然后基于它的孩子?

时间:2017-07-18 17:34:48

标签: docker docker-compose dockerfile docker-stack

为了澄清,当我说基本图像时,我指的是具有所有常见配置的父图像,因此基于它的孩子不需要单独下载依赖项。

根据我的理解,docker-compose.yml文件是运行时配置,而Dockerfiles是构建时配置。但是,使用docker-compose有一个build选项,我想知道如何使用它来构建基本图像。

截至目前,我使用一个运行其他shellcript的shellcript。一个人构建我的所有图像,从它创建的基本图像。另一个将它们作为具有必要配置的容器运行。但是,基本映像永远不会作为容器运行。

目前,我希望将shellcript改成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

制作图像的shellcript如下:

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

我的问题归结为一件事,我可以创建这个Base图像,而无需在装有docker-compose的容器中运行它。 (所有Dockerfiles都以FROM base:latest开头,而不是基本身。我希望让其他人尽可能轻松,这样他们只需要运行一个命令。

编辑:我使用的是版本3,根据文档,build:被忽略,而docker-compose只接受预先构建的图像。

5 个答案:

答案 0 :(得分:3)

根据文档,服务的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命令时都不需要构建它

答案 1 :(得分:3)

是的,有点。像这样使用它:

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重用。

答案 2 :(得分:2)

Kanedias'答案的补充很小。如果您选择遵循他的方法(这是我的选择),则可以避免使用--scale命令中带有docker-compose up标志的基础图像实例化容器:

docker-compose up --scale wls-admin=0

通过up命令documentation

    --scale SERVICE=NUM        Scale SERVICE to NUM instances. Overrides the
                               `scale` setting in the Compose file if present.

要注意的重要一件事是docker-compose.yml中的scale设置已在v3中删除,因此在v3中实际上没有要覆盖的内容。

答案 3 :(得分:1)

从制作图像的shellscript中,我们可以看到你在不同的目录中有不同的dockerfiles。您可以使用它来创建docker-compose.yml文件。 build设置用于告诉docker它应该如何构建图像。

您可以这种方式在撰写文件中使用这些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-imagedockerfile,用于构建图片。

这可以是您的某项服务的结构。以类似的方式,您也可以创建其他服务。虽然usig docker-compose您不需要为每个网络指定网络,因为在docker-compose.yml文件中声明的所有服务都是隔离网络的一部分。

答案 4 :(得分:0)

你可以实现一个脚本,用特定的标签 docker build ... -t your_tag 构建镜像,而不是运行 docker-compose,然后运行 ​​docker-compose。在儿童 dockerfiles 中,您可以使用 FROM your_tag