23

为澄清起见,当我说基础镜像时,我指的是具有所有通用配置的父镜像,因此基于它的子镜像不需要单独下载依赖项。

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

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

目前,我希望将 shellscript 转换为 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

制作图像的 shellscript 如下:

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-compose 在容器中运行它的情况下创建这个基础镜像吗?FROM base:latest(所有 Dockerfile 都以基础本身以外的开头)。我希望对其他人尽可能简单,以便他们只需要运行一个命令。

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

4

5 回答 5

12

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

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命名的 docker 映像。weblogic-domain这个镜像可以被其他服务的 Dockerfile 重用,即使在同一个构建过程中。

于 2018-07-04T12:30:53.167 回答
4

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

Docker 是您的应用程序运行的环境。当你创建一个基础镜像时,它应该有一些不会经常改变的东西。然后您需要构建一次 baseiamge 并上传到您的存储库并FROM baseimage:latest在 Dockerfile 中使用。

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

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

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

于 2017-07-18T17:48:42.310 回答
4

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

于 2021-08-10T10:37:35.763 回答
2

只是对Kanedias 的回答的一个小补充。如果您选择遵循他的方法(这是我的选择),您可以避免使用命令中的--scale标志为基本映像实例化容器docker-compose up

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

up命令文档

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

需要注意的一件重要事情是scaledocker-compose.yml 中的设置在 v3 中被删除,因此在 v3 中实际上没有什么可以覆盖的。

于 2020-06-24T14:11:42.363 回答
1

从制作图像的 shellscript 中,我们可以看到您在不同的目录中有不同的 dockerfile。您可以使用它来创建 docker-compose.yml 文件。构建设置用于告诉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用于构建图像的。

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

于 2017-07-18T17:55:13.837 回答