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

Wil*_*bok 9 docker dockerfile docker-compose docker-stack

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

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

截至目前,我使用一个运行其他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
Run Code Online (Sandbox Code Playgroud)

制作图像的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
Run Code Online (Sandbox Code Playgroud)

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

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

Seb*_*ner 14

根据 @amiasato 的 anser 进行更多研究,看起来好像有一个replicated密钥,您可以将其设置0为如下:

version: "3"
services:
  base-image:
    build:
      context: .
      dockerfile: Dockerfile-base
    deploy:
      mode: replicated
      replicas: 0
Run Code Online (Sandbox Code Playgroud)

请参阅https://docs.docker.com/compose/compose-file/compose-file-v3/#replicas


Kan*_*ias 6

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

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
Run Code Online (Sandbox Code Playgroud)

image子句使docker-compose build生成weblogic-domain为此服务命名的docker映像。即使在相同的构建过程中,该映像也可以被其他服务的Dockerfile重用。

  • 是的,但是“docker-compose up”将尝试从中运行容器,我想避免它,因为它只是其他服务的基础映像。 (6认同)
  • 您可以将基本 Dockerfile 中的 CMD 设置为“echo”。这样,您的基础映像确实会启动,但很快就会退出。不理想,但它有效。 (3认同)
  • @Mišo 是的,docker-compose [不支持这个](https://github.com/docker/compose/issues/1896) 截至目前。显然,当前的解决方案是使用多个 yaml 文件,首先在其中执行“build”,然后在另一个文件上执行“up”。 (2认同)

小智 5

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


ved*_*thk 3

根据文档,build服务选项将目录作为参数,其中包含著名的Dockerfile. 无法先构建基础映像,然后再构建服务的实际映像。

Docker 是应用程序运行的环境。当您创建基础映像时,它应该包含不会经常更改的内容。然后您需要构建一次 baseiamge 并上传到您的存储库并FROM baseimage:latest在 Dockerfile 中使用。

例如,如果您正在构建 python 应用程序,您可以从 python 创建它并安装要求:

FROM python:3.6
COPY requirements.txt .
RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

这里python:3.6是基本映像,不会经常更改,因此您无需每次运行 docker compose 命令时都构建它。