2017-07-18 66 views
1

为了便于说明,当我说基础图像时,我的意思是具有所有常见配置的父图像,以便基于它的孩子不需要单独下载依赖关系。构建基础图像的Docker-compose.yml文件,然后基于它的孩子?

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

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

目前,shell脚本我希望变成一个码头工人,撰写文件,看起来像这样:

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 

我的问题归结为一件事,我可以创建这个基本的图像,而不用在docker-compose的容器中运行它。 (所有的Dockerfiles都以FROM base:latest开始,除了基地本身)。我希望让其他人尽可能简单,以便他们只需运行一个命令。

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

回答

2

根据文档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撰写命令时都建立它

+0

那么最好是先建立基础图像,然后在一个单独的命令中执行docker-compose,并且如果我正在执行一个命令 - 全部都有一个shell脚本运行这两个命令? –

+1

@WillParzybok这似乎是一个更好的主意,适合你的目的。 – Ayushya

+0

这就是我所做的。詹金斯建立我的基本图像,并将其放入私人图像回购。如果您使用版本号正确标记它们,则始终可以控制。这是一个相当直接的过程来处理。 – Grimmy

0

从制作图像的shell脚本中,我们可以看到在不同的目录中有不同的docker文件。你可以使用它来创建一个docker-compose.yml文件。 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用于构建图像。

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

+0

我误解了这个问题吗? – Ayushya

+0

有点,这可能是我糟糕的措辞的错。 base-image目录包含一个Dockerfile,用于创建名为'''base''的图像。所有其他的容器,都有自己的目录,它们有自己的Dockerfile,在它们的'''FROM'''语句中引用这个基地。换句话说,基本本身不会作为容器运行,而是所有其他图像的预建基础。 –

+0

@ayushya你的撰写文件将使用'base-image'目录来创建图像并将其标记为'api_img'。 @WillParzybok希望在构建文件中提供任何服务时创建基础映像。 – vedarthk