由Docker编写的条件语句(例如,仅在有条件时添加卷)

jua*_*cks 9 cloud conditional docker docker-compose devops

我想将卷添加到我的服务中,但前提是最终用户为其提供了一个文件夹。否则,不应安装任何卷,因为已准备好的映像在默认文件夹中具有有效数据。

也就是说,我想做类似的事情;伪代码:

services:

  my_awesome_service:

    volumes:
      if ${VARIABLE} => ${VARIABLE}:/app/folder
Run Code Online (Sandbox Code Playgroud)

在docker-compose文件中建立这样的条件语句是否可行和可定义?我看到的使之成为可能的唯一方法是,首先定义一个基本的docker-compose文件,该文件没有卷挂载,并且仅在$VARIABLE定义了docker-compose文件后才对其进行调用。这对于单个或几个条件都很好,但是如果有很多条件,就会变得很讨厌。

有什么办法吗?

gat*_*ich 28

穷人的解决办法:

    volumes:
      ${VARIABLE:-/dev/null}:/app/folder
Run Code Online (Sandbox Code Playgroud)

或者:

    volumes:
      ${VARIABLE:-/dev/null}:${VARIABLE:-/tmp}/app/folder
Run Code Online (Sandbox Code Playgroud)

  • 我以前怎么不知道环境变量默认值?这非常有用,不仅在 docker-compose 文件中 (7认同)
  • 这里有一个答案[解释了 `:-` 的语法的作用](/sf/ask/727328451/)。TL;DR:它指定未定义“VARIABLE”时使用的默认值。 (5认同)
  • 这是一个有风险的解决方案。1. 容器内没有任何内容可以将 `/app/folder` 与任何常规目录区分开来。将“/app/folder”映射到主机的“/dev/null”可能会导致一些问题。例如。容器应用程序将数据写入或移动到“/app/folder”,期望数据被保存,但数据将会丢失。此外,错误处理不会完成其工作,因为将数据复制或移动到“/dev/null”不会导致任何错误。因此,即使具有正确的写入/移动错误处理的应用程序也会愉快地继续执行,就好像所有内容都保存到“/app/folder”中一样 (3认同)

BMi*_*tch 5

目前没有这样的东西。我可以提出的实现此目标的选项包括:

  1. 制作大量的组合文件,然后将组成最终文件所需的部分合并在一起。

  2. 动态生成您的撰写文件。像jsonnet之类的东西可能是一个很好的起点。

  3. 跳过撰写,仅动态生成docker run命令。这开始缺乏可移植性,但是某些用例只是您自己编写脚本更容易。

  4. 将PR提交到compose和docker / cli github存储库以扩展compose功能。使用golang模板语法执行此操作对我来说最有意义。


jua*_*cks 4

目前为止,docker-compose的格式不支持条件语句。

两种可能的解决方法是:

  1. 将“复杂”(类似列表)变量传递给 docker-compose,如下例所示

docker-compose.yaml:

command: ${COMMAND_PARAMS}
Run Code Online (Sandbox Code Playgroud)

重击:

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

(感谢 github 上的原始海报,@shin-)

  1. 在名为 的文件夹中准备 docker 映像中的默认文件夹folder_defaults,然后始终在 docker-compose.yml 中定义卷,但最后,在 docker 映像中有一个内部脚本来检查卷文件夹是否为空,以及如果是这样的ln -sfolder_defaults;否则就保持原样。

条件脚本示例:

if [ -z "$(ls -A /a/folder)" ]; then
  do something... using /a/folder_defaults
fi
Run Code Online (Sandbox Code Playgroud)