Docker-compose,条件语句?(例如,仅在条件下添加体积)

v9tzhpje  于 2023-01-20  发布在  Docker
关注(0)|答案(7)|浏览(133)

我想将卷添加到我的服务,但前提是最终用户必须为其提供文件夹。否则,不应装入任何卷,因为已准备好的映像在默认文件夹中具有有效数据。
也就是说,我想做类似于(伪代码)的事情:

services:

  my_awesome_service:
  
    volumes:
      if ${VARIABLE} => ${VARIABLE}:/app/folder
    • 此类条件语句是否可在停靠器合成文件中定义?**

我认为实现这一点的唯一方法是首先定义一个基本的docker-compose文件,它没有卷挂载,并且只有在定义了$VARIABLE的情况下才调用第二个docker-compose文件。这对于单个或少数几个条件来说很好,但如果有很多条件,就会变得很糟糕。
有办法吗?

x9ybnkn6

x9ybnkn61#

穷人的解决方案:

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

或者:

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

e37o9pze2#

目前还不存在这样的东西。我可以想到的实现这一点的选项包括:
1.制作大量的合成文件片段,并将所需的部分合并在一起以构建最终文件。
1.动态生成合成文件,像jsonnet这样的文件可能是个不错的起点。
1.跳过编写,直接动态生成docker run命令,这开始缺乏可移植性,但有些用例更容易自己编写脚本。
1.提交一个PR到compose和docker/cli github repos来扩展compose功能,用golang模板语法来做这件事对我来说最有意义。

20jt8wwn

20jt8wwn3#

是的,我不认为docker-compose的格式支持条件语句。
但是,有两种解决方案:
1.将一个“complex”(类似列表)变量传递给docker-compose,如下例所示:
docker-compose.yaml:

command: ${COMMAND_PARAMS}

猛击:

#!/bin/bash
if test -z $CONDITION; then
  params="-param1 ${MIPARAM1}"
else
  params="-param1 ${MIPARAM1} -param2 ${MIPARAM2}"
fi
COMMAND_PARAMS=$params docker-compose up

(作者为github上的原创海报,@shin-)
1.在docker映像中准备一个名为folder_defaults之类的文件夹中的默认文件夹,然后始终在docker-compose.yml中定义卷,最后在docker映像中使用一个内部脚本来检查卷文件夹是否为空,如果为空,则将ln -s设置为folder_defaults;否则就保持原样。
条件脚本示例:

if [ -z "$(ls -A /a/folder)" ]; then
  do something... using /a/folder_defaults
fi
l3zydbqr

l3zydbqr4#

如果您使用Rancher进行编排,则可以在Rancher版本的docker-compose中使用转义{{...}}作为条件语句。
了解更多关于集成GO模板系统here的信息。

hfsqlsce

hfsqlsce5#

在docker-compose中使用条件stmts是可能的。检查变量替换。文档中只提供了最简单的if-else。由于我没有尝试过涉及字符串的复杂表达式,所以我不能确定。但以下是在尝试条件变量时你可能要记住的几点:

  • Docker-compose文件中的环境变量(只有一个键)被解析为运行Compose的计算机上的值。因此,在Docker-compose中使用${CHEESE}时,应在.env文件中设置CHEESE=“cheddar”或在主机中手动导出。
  • 或者.env文件可以用env_file选项设置。此文件中的变量在environment选项下的变量之前导出到docker容器中。这意味着environment中的变量将覆盖env_file中的变量。
vngu2lb8

vngu2lb86#

我们可以在docker-compose.yml文件中使用条件语句,如下所示:

#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 }}
dba5bblo

dba5bblo7#

使用JavaScript或Python等编程语言生成yaml文件
例如,在JavaScript中,您可以在json中创建配置,然后将其转换为yaml,并在部署之前写入文件系统中的某个位置

相关问题