I want to add a volume to my service, but only if the final user gave a folder for it. Otherwise, no volume should be mounted, for the already-prepared image has valid data in a
Yeah, I do not think docker-compose's format supports conditional statements.
However, two solutions could be:
docker-compose.yaml:
command: ${COMMAND_PARAMS}
bash:
#!/bin/bash
if test -z $CONDITION; then
params="-param1 ${MIPARAM1}"
else
params="-param1 ${MIPARAM1} -param2 ${MIPARAM2}"
fi
COMMAND_PARAMS=$params docker-compose up
(credits goes to original poster on github, @shin-)
folder_defaults
, then have the volume always defined in docker-compose.yml, but then finally, have an internal script in the docker image that checks whether the volume folder is empty, and if so ln -s
to the folder_defaults
; otherwise leave it as it is. Example of the conditional script:
if [ -z "$(ls -A /a/folder)" ]; then
do something... using /a/folder_defaults
fi
Poor man's solution:
volumes:
${VARIABLE:-/dev/null}:/app/folder
Or:
volumes:
${VARIABLE:-/dev/null}:${VARIABLE:-/tmp}/app/folder
We can use conditional statement in docker-compose.yml file as below:
#jinja2: lstrip_blocks: True
version: "3.2"
services:
app-name:
image: url
deploy:
replicas: {{replication-num}}
resources:
limits:
memory: 4G
reservations:
memory: 1G
restart_policy:
condition: any
max_attempts: 3
update_config:
delay: 60s
failure_action: rollback
parallelism: 1
monitor: 30s
placement:
constraints:
- node.labels.node == worker
ports:
- "{{url}}:8000"
environment:
ps_environment: "{{env}}"
{% if env=='sandbox' %}
extra_hosts:
- {{ sandbox_fully }}
{% endif %}
secrets:
- source: pwdFile
labels:
- container_name=app-name
networks:
- App_External_Overlay
volumes:
- {{ dir }}:{{ dir }}
Nothing like this currently exists. Options to implement this that I can come up with include:
Make lots of compose file pieces, and merge together the parts you need to build up the final file.
Dynamically generate your compose file. Something like jsonnet may be a good starting point.
Skip compose, and just dynamically generate your docker run
command. This starts to lack portability but some use cases are just easier to script yourself.
Submit a PR to the compose and docker/cli github repos to extend the compose functionality. Doing this with a golang template syntax would make the most sense to me.
If you are using Rancher for orchestration, there are escapes {{...}}
available you can use for conditional statements in Rancher's version of docker-compose.
Read more about the integrated GO templating system here.
Using conditional stmts in docker-compose is somewhat possible. Checkout variable substitution. The documentation is available for just the simplest of if-else. And since I have not tried with complex expressions involving strings, I cannot be sure. But following are the points you might want to keep in mind when trying out conditional variables:
env_file
option. Variables in this file are exported in the docker container before the variables under environment
option. That means variables in environment
will override variables in env_file
.