在 docker-compose 的 .env 文件中使用多行值

Posted

技术标签:

【中文标题】在 docker-compose 的 .env 文件中使用多行值【英文标题】:Using multi-line value in .env file in docker-compose 【发布时间】:2019-10-21 20:01:11 【问题描述】:

我有一个安装程序,它可以将一些值输出到 .env 文件中,供 docker-compose 使用。到目前为止,所有这些都有效,除了一个看似无法使用的 SSH 密钥。

到目前为止,我已经尝试过使用正确格式的私钥并用\n 替换新行。但是,这会进一步破坏工作流程,并且不会在容器中使用 printenv 作为必需的多行变量。

docker-compose.yml

myservice:
  build: .
  environment:
    - SSH_KEY
    - SINGLE_LINE_VALUE

.env(忽略明显损坏的 sshkey)

SINGLE_LINE_VALUE=I Load just fine
SSH_KEY="---------------
ABCDEFGH
--------------------
"

到容器运行时,SSH_KEY 的环境值只是“---------------

非常感谢任何想法。

【问题讨论】:

这能回答你的问题吗? How to Export a Multi-line Environment Variable in Bash/Terminal e.g: RSA Private Key 【参考方案1】:

如果您不介意不使用.env 文件(也许该环境变量仅在单个容器中使用)。您可以直接在docker-compose.yml 中定义环境变量,在那里您可以充分利用 YAML 格式化选项。即:

myservice:
  build: .
  environment:
    SSH_KEY: >
      --------- WHATEVER ----------
      randomkeybase64thingforyourse
      rvice
      ------- END WHATEVER --------

附带说明,您不必在environment 部分中复制.env 值。 .env 变量在docker-compose.yml 文件中使用,但不在容器环境中使用。但是,您可以这样做:

myservice:
  build: .
  env_file:
    # Files in this array have the same format as `.env` files, but they are
    # passed to container's environment instead being used inside this
    # `docker-compose.yml` file
    - variables.env
  environment:
    SSH_KEY: >
      --------- WHATEVER ----------
      randomkeybase64thingforyourse
      rvice
      ------- END WHATEVER --------

【讨论】:

不要忘记用第二个符号转义美元符号,例如$$ 而不是 $(因为 docker-compose 动态更新这些)。另外,这里值得注意的是,您还可以使用| 语法来保留换行符。【参考方案2】:

也许不是最好的解决方案,但至少可以工作。

.env

KEY="--------------- \n ABCDEFGH \n --------------------"

docker-compose.yml

version: '3'

services:
  test:
    image: ubuntu
    environment:
      - SSH_KEY=$KEY
    command: bash -c "echo \"$$SSH_KEY\" | perl -pe 's/\\\n/\n/g' "

$$ 表示美元符号的转义,因此 docker-compose 不会在 .yml 文件中而是在运行时评估该变量

需要 perl 替换,因为 docker-compose 会自动将转义斜杠添加到换行符。

【讨论】:

希望我可以让它与正在运行的图像无关。我为此使用的用例是使用使用环境变量的 JCasC 插件将环境变量加载到 jenkins 中。但是我认为使用 tr 的解决方案可能也可以工作,因为它不需要 perl。它要求密钥加载用“”替换的新行。在主机系统上至少 echo "" | tr " " "\n" 将密钥格式化得足够近,但又很老套。

以上是关于在 docker-compose 的 .env 文件中使用多行值的主要内容,如果未能解决你的问题,请参考以下文章

在 docker-compose 的 .env 文件中使用多行值

如何从.env文件获取环境变量到docker-compose.yml?

docker-compose .env 与 direnv .envrc

可以将来自docker-compose.yml的env变量传递给dockerfile吗?

Docker-compose env文件不起作用

如何从env_file获取docker-compose的端口?