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

问题描述 投票:0回答:7

我有一个安装程序,它将一些值输出到 .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 的环境值只是“---------------

非常感谢任何想法。

docker docker-compose environment-variables
7个回答
11
投票

如果您不介意不使用

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

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

顺便说一句,您不必复制

.env
部分内的
environment
值。
.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 --------

4
投票

根据用于解析 Docker Compose 中的 envfiles 的 dotenv 文档(link),应该使用双引号和换行符(

\n
)来在解析后实现新行。

示例:

PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIGHAgEAMBMGByqGSM49AgEGCCqGSU72AwEHBG0wawIBAQQgf+zcD+dC95xJH2YIGtZxg6cBEtZYzeMHZIdAtGarkfahRANCAAReRj+7DNK3rfudJGSo2k9mUBhmz2zqE3d4sfpkIGUizc1s8UXYmnhgezq6fceV9o6HG1I6BdVWi5cfbwTB17Qf\n-----END PRIVATE KEY-----"

3
投票

也许不是最好的解决方案,但至少有效。

.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 会自动将转义斜杠添加到新行字符。


2
投票

我已经成功地将它与 dbl-quotes 一起使用:

docker-compose.yaml

myservice:
  build: .
  environment:
    - JAVA_OPTIONS
    - SINGLE_LINE_VALUE

.env

JAVA_OPTIONS="
  -Doption1=value1
  -Doption2=value2
  -Xms=8g
"

docker 撰写配置

...
    environment:
      JAVA_OPTIONS: |2

          -Doption1=value1
          -Doption2=value2
          -Xms=8g
...

1
投票

我在尝试将证书添加到我的 docker.env 文件时遇到了这个问题,该文件无法正确拾取。

在 .env 文件中这样做不起作用

CERTIFICATE=MIIC5DCCAk2gAwIBAgIJAKgUiZPOajC0MA0GCSqGSIb3DQEBBAUAMFYxCzAJBgNV
BAYTAkRLMRMwEQYDVQQIEwpTb21lLVN0YXRlMQ8wDQYDVQQHEwZBYXJodXMxITAf
...

这有效(注意 ):

CERTIFICATE=MIIC5DCCAk2gAwIBAgIJAKgUiZPOajC0MA0GCSqGSIb3DQEBBAUAMFYxCzAJBgNV\nBAYTAkRLMRMwEQYDVQQIEwpTb21lLVN0YXRlMQ8wDQYDVQQHEwZBYXJodXMxITAf...

0
投票

我刚刚遇到了同样的问题。 Docker 不会读取我的 .env 文件中的换行符。我的解决方案是在 .env 中用“%”替换每个换行符。在我的源代码中,我获取了环境变量,并将每个“%”替换为换行符。

这不是最优雅的解决方案,但它确实有效。


0
投票

我将为 docker run 提供我自己的选项。这里讨论了在 .env 文件中传递多行变量的问题。 https://github.com/moby/moby/issues/12997 但遗憾的是,截至2024年该问题仍未得到解决,开发者建议使用sh/bash解决问题

如何使用sh解决问题

  1. 将多行数据放入文件并导入到变量

MY_VAR.env

Text
Text
Text

docker run -e MY_VAR="$(cat MY_VAR.env)"

  1. 如果您需要从文件传递许多变量,那么您将必须执行复合查询

文件中的变量格式

-e NAME_VARIABLE="Multi-line text" \

我的.env

-e MY_VAR="
Text
Text
text
" \
-e MY_VAR2="TEXT" \
-e MY_VAR3="TEXT
TEXT
TEXT"

sh -c "docker run $(cat my.env)"

© www.soinside.com 2019 - 2024. All rights reserved.