Docker swarm: 'build' configuration in docker compose file ignored during stack deployment
Solution 1
Short answer is, you can not use the build
command with docker stack deploy
.
From the 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.
An alternative is to build the docker image before deploying the your swarm cluster.
Use the docker build
command to create the docker image; Push the created image to a (public or private) docker registry
; and reference it in your docker compose
file.
Solution 2
If anyone is still on this you can tag the built image in compose by setting the image parameter along with the build parameter, as you can see in the build section of the docs. So the file should look like:
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
then you can do:
docker-compose build
docker-compose push
docker stack deploy -c /home/docker/docker-compose.yml app
Solution 3
The compose file serves both tools: docker-compose
cli, and docker stack
cli. the "build" options work in docker-compose
but are ignored by stack commands, and the "deploy" options work in stack commands but are ignored by docker-compose
.
Swarm is not designed to build your images for you. It assumes you're images are available in a image registry. Multiple nodes in a Swarm can't share images with each other, so a registry (either remote or running on the Swarm itself) is the only way they can all ensure they can pull the same exact image.
So the typical example is to either have Docker Hub auto-build your images based on code commits, or have your CI/CD platform build the images and push to a registry. Then your stack deploy
commands will pull the proper image from that registry.
Related videos on Youtube
dinup24
Updated on June 04, 2022Comments
-
dinup24 almost 2 years
We have created a docker compose file with multiple services. The images for these services are built in runtime using 'build' configuration option. The corresponding Dockerfile(s) are given in the respective directories.
Sample docker compose file...
version: '3' services: db2server: build: ./db2server ports: - "50005:50000" command: ["db2start"] appruntime: build: ./appruntime depends_on: - db2server
This docker compose file works with
docker-compose
command.- The images are built in runtime from the Dockerfile(s) present in
db2server
&appruntime
directories - These images get deployed in the host machine
But when we try to deploy this in a docker swarm, the following error is thrown...
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
Looks like the 'build' configuration option is ignored during stack deployment in docker swarm.
How can we deploy these services (with build option) defined in docker compose file in a docker swarm.
- The images are built in runtime from the Dockerfile(s) present in
-
adnanmuttaleb over 4 yearsI found building, pushing image is time consuming for minor development modifications, is there a less time-consuming alternative?
-
Marinos An almost 4 yearsIt would be nice if
docker stack
supported flags like--build
which would only be available when using e.g.--orchestrator none
or--orchestrator singlenode
-
vlizana over 3 yearsYou can use labels to set a development node, you can constrain your stack to run only in that node and that way you don't have to push the image if you build it on that same node.