Docker swarm:'build' 配置在 docker compose 文件中,在堆栈部署期间被忽略
Docker swarm: 'build' configuration in docker compose file ignored during stack deployment
我们已经创建了一个包含多个服务的 docker 组合文件。这些服务的图像是使用 'build' 配置选项在运行时构建的。相应的 Dockerfile(s) 在各自的目录中给出。
示例docker 撰写文件...
version: '3'
services:
db2server:
build: ./db2server
ports:
- "50005:50000"
command: ["db2start"]
appruntime:
build: ./appruntime
depends_on:
- db2server
此 docker 撰写文件适用于 docker-compose
命令。
- 图像是在
db2server
& appruntime
目录 中存在的 Dockerfile 在运行时构建的
- 这些图像部署在主机中
但是当我们尝试在 docker swarm 中部署它时,会抛出以下错误...
docker stack deploy -c /home/docker/docker-compose.yml app
Ignoring unsupported options: build
Creating network app_default
Creating service app_db2server
failed to create service app_db2server: Error response from daemon: rpc error: code = InvalidArgument desc = ContainerSpec: image reference must be provided
看起来 'build' 配置选项在 docker 群中的堆栈部署期间被忽略了。
我们如何部署 docker compose 文件中定义的这些服务(使用构建选项)docker swarm。
简而言之,您不能将 build
命令与 docker stack deploy
一起使用。
来自docs:
Note: The docker stack
command build
option is ignored when deploying a stack in swarm mode with a (version 3) Compose file. The docker stack
command accepts only pre-built images.
另一种方法是在部署 swarm 集群之前构建 docker 映像。
使用docker build
命令创建docker图像;将创建的镜像推送到(public or private)docker registry
;并在您的 docker compose
文件中引用它。
撰写文件提供两种工具:docker-compose
cli 和 docker stack
cli。 "build" 选项适用于 docker-compose
但被堆栈命令忽略,"deploy" 选项适用于堆栈命令但被 docker-compose
.
忽略
Swarm 不是为您构建图像而设计的。它假定您的图像在图像注册表中可用。 Swarm 中的多个节点不能彼此共享图像,因此注册表(远程或 运行 在 Swarm 本身上)是它们都可以确保它们可以提取完全相同的图像的唯一方法。
所以典型的例子是让 Docker Hub 根据代码提交自动构建你的图像,或者让你的 CI/CD 平台构建图像并推送到注册表。然后您的 stack deploy
命令将从该注册表中提取正确的图像。
如果有人还在使用它,您可以通过设置图像参数和构建参数来在 compose 中标记构建的图像,如您在 docs 的构建部分中所见。所以文件应该如下所示:
version: '3'
services:
db2server:
image: <your registry here>/db2server
build: ./db2server
ports:
- "50005:50000"
command: ["db2start"]
appruntime:
image: <your registry here>/appruntime
build: ./appruntime
depends_on:
- db2server
那么你可以这样做:
docker-compose build
docker-compose push
docker stack deploy -c /home/docker/docker-compose.yml app
我们已经创建了一个包含多个服务的 docker 组合文件。这些服务的图像是使用 'build' 配置选项在运行时构建的。相应的 Dockerfile(s) 在各自的目录中给出。
示例docker 撰写文件...
version: '3'
services:
db2server:
build: ./db2server
ports:
- "50005:50000"
command: ["db2start"]
appruntime:
build: ./appruntime
depends_on:
- db2server
此 docker 撰写文件适用于 docker-compose
命令。
- 图像是在
db2server
&appruntime
目录 中存在的 Dockerfile 在运行时构建的
- 这些图像部署在主机中
但是当我们尝试在 docker swarm 中部署它时,会抛出以下错误...
docker stack deploy -c /home/docker/docker-compose.yml app
Ignoring unsupported options: build
Creating network app_default
Creating service app_db2server
failed to create service app_db2server: Error response from daemon: rpc error: code = InvalidArgument desc = ContainerSpec: image reference must be provided
看起来 'build' 配置选项在 docker 群中的堆栈部署期间被忽略了。
我们如何部署 docker compose 文件中定义的这些服务(使用构建选项)docker swarm。
简而言之,您不能将 build
命令与 docker stack deploy
一起使用。
来自docs:
Note: The
docker stack
commandbuild
option is ignored when deploying a stack in swarm mode with a (version 3) Compose file. Thedocker stack
command accepts only pre-built images.
另一种方法是在部署 swarm 集群之前构建 docker 映像。
使用docker build
命令创建docker图像;将创建的镜像推送到(public or private)docker registry
;并在您的 docker compose
文件中引用它。
撰写文件提供两种工具:docker-compose
cli 和 docker stack
cli。 "build" 选项适用于 docker-compose
但被堆栈命令忽略,"deploy" 选项适用于堆栈命令但被 docker-compose
.
Swarm 不是为您构建图像而设计的。它假定您的图像在图像注册表中可用。 Swarm 中的多个节点不能彼此共享图像,因此注册表(远程或 运行 在 Swarm 本身上)是它们都可以确保它们可以提取完全相同的图像的唯一方法。
所以典型的例子是让 Docker Hub 根据代码提交自动构建你的图像,或者让你的 CI/CD 平台构建图像并推送到注册表。然后您的 stack deploy
命令将从该注册表中提取正确的图像。
如果有人还在使用它,您可以通过设置图像参数和构建参数来在 compose 中标记构建的图像,如您在 docs 的构建部分中所见。所以文件应该如下所示:
version: '3'
services:
db2server:
image: <your registry here>/db2server
build: ./db2server
ports:
- "50005:50000"
command: ["db2start"]
appruntime:
image: <your registry here>/appruntime
build: ./appruntime
depends_on:
- db2server
那么你可以这样做:
docker-compose build
docker-compose push
docker stack deploy -c /home/docker/docker-compose.yml app