Docker-compose, conditional statements? (e.g. add volume only if condition)

后端 未结 6 1687
野趣味
野趣味 2021-02-12 02:25

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

相关标签:
6条回答
  • 2021-02-12 03:00

    Yeah, I do not think docker-compose's format supports conditional statements.

    However, two solutions could be:

    1. Pass a "complex" (list-like) variable to the docker-compose such as in this example:

    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-)

    1. Prepare the default folder in the docker image in a folder named something like 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
    
    0 讨论(0)
  • 2021-02-12 03:11

    Poor man's solution:

        volumes:
          ${VARIABLE:-/dev/null}:/app/folder
    

    Or:

        volumes:
          ${VARIABLE:-/dev/null}:${VARIABLE:-/tmp}/app/folder
    
    0 讨论(0)
  • 2021-02-12 03:11

    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 }}
    
    0 讨论(0)
  • 2021-02-12 03:16

    Nothing like this currently exists. Options to implement this that I can come up with include:

    1. Make lots of compose file pieces, and merge together the parts you need to build up the final file.

    2. Dynamically generate your compose file. Something like jsonnet may be a good starting point.

    3. 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.

    4. 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.

    0 讨论(0)
  • 2021-02-12 03:17

    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.

    0 讨论(0)
  • 2021-02-12 03:19

    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:

    • Environment variables in docker-compose file (with only a key) are resolved to their values on the machine Compose is running on. So when using ${CHEESE} in docker-compose, one should have CHEESE="cheddar" set in .env file or exported manually in host machine.
    • Alternatively .env file can be set with 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 .
    0 讨论(0)
提交回复
热议问题