Docker-compose.yml文件build立一个基本的形象,然后基于它的儿童?

澄清一下,当我说基础图像时,我的意思是具有所有常见configuration的父图像,以便基于它的孩子不需要单独下载依赖关系。

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

截至目前,我使用一个运行其他shell脚本的shell脚本。 一个从我们创build的基本图像构build我的所有图像。 另一个将它们作为具有必要configuration的容器来运行。 但是,基本映像从不作为容器运行。

目前,我希望将脚本改为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 

生成图像的shell脚本如下所示:

 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 

我的问题归结为一件事情,我可以创build这个基本的图像,而无需运行它在一个容器与docker组成。 (所有Dockerfiles都以FROM base:latest开始,除了base本身)。 我希望让其他人尽可能简单,这样他们只需要运行一个命令。

编辑:我使用版本3,并根据文档, build:被忽略,和docker构成只接受预先构build的图像。

根据文档,服务的build选项将目录作为包含着名的Dockerfile的参数。 没有办法build立一个基本的形象,然后是服务的实际形象。

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

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

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

在这里, python:3.6不会经常更改基本映像,因此每次运行docker撰写命令时都不需要编译它

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

你可以用这种方式在你的撰写文件中使用这些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-image有一个dockerfile用于构build图像。

这可以是你的一个服务的结构。 以类似的方式,您也可以创build其他服务。 尽pipedocker docker-compose不需要指定每个networking,因为在docker-compose.yml文件中声明的所有服务都是孤立networking的一部分。