I have a docker-compose.yml something like bellow:
networks:
smstake:
ipam:
config:
- subnet: 10.0.10.0/24
services:
app:
image: smstake:latest
ports:
- 8000:80
networks:
- smstake
depends_on:
- db
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
I am using it for deploying the service in nodes running in swarm mode.
Every time an image is build, the image name may differ based on user passed branch name or tagname which works as tag for the image. I am running it from the jenkins. For eg: smstake:
How can I dynamically add the image name to the image parameter of the service. As docker stack does not support build. I cannot even use it. I am not able to figure out the right way to do it.
I am trying to deploy with docker stack deploy -c docker-compose.yml stackname
My exact Requirement being:
The reason behind creating new image for new TAG is so that I can rollback to previously build image.
Some edit: Added the image-name to add in configuration.env file which will be passed using echo command in deploy job before deploy command runs. than the docker-compose will look like following
version: '3.4'
networks:
smstake:
services:
db:
image: mysql:5.7
networks:
- smstake
ports:
- "3306"
env_file:
- configuration.env
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
deploy:
mode: replicated
replicas: 1
app:
env_file:
- configuration.env
image: ${SMSTAKE_VERSION}
ports:
- 8000:80
networks:
- smstake
depends_on:
- db
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
volumes:
mysql_data:
Why is it not reading from the configuration.env file ,the right value with that key is set there I have confirmed . Error message
Creating service smstake_app failed to create service smstake_app: Error response from daemon: rpc error: code = InvalidArgument desc = ContainerSpec: image reference must be provided Build step 'Execute shell' marked build as failure Finished: FAILURE
In the docker-compose file, you can have variables substitution based on environment variables. This is documented under Variable Substitution .
You can use the following to specify a different version for the image:
image: smstake:${SMSTAKE_VERSION}
And inside the jenkins job that deploys, you can just set this environment variable and run the docker stack command:
SMSTAKE_VERSION=v1.2.0 docker stack deploy -c docker-compose.yml stackname
You need to do it in two stages
docker-compose config | docker stack deploy -c - stackname
You need to use docker-compose
and not the docker compose
V2 as docker stack
does not support version
-less manifests (at least not until the 21.xx version which as of this writing is not out yet)
You also get the added bonus of using a .env
file to read your environments which makes it easy for devs as well.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.