为了澄清,当我说基本图像时,我指的是具有所有常见配置的父图像,因此基于它的孩子不需要单独下载依赖项。
根据我的理解,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只接受预先构建的图像。
答案 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-image
有dockerfile
,用于构建图片。
这可以是您的某项服务的结构。以类似的方式,您也可以创建其他服务。虽然usig docker-compose
您不需要为每个网络指定网络,因为在docker-compose.yml
文件中声明的所有服务都是隔离网络的一部分。
答案 4 :(得分:0)
你可以实现一个脚本,用特定的标签 docker build ... -t your_tag
构建镜像,而不是运行 docker-compose,然后运行 docker-compose。在儿童 dockerfiles 中,您可以使用 FROM your_tag
。