在 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 "以上是关于在 docker-compose 的 .env 文件中使用多行值的主要内容,如果未能解决你的问题,请参考以下文章
在 docker-compose 的 .env 文件中使用多行值
如何从.env文件获取环境变量到docker-compose.yml?
docker-compose .env 与 direnv .envrc