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

Phi*_*ver 21 environment-variables docker docker-compose

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

到目前为止,我已经尝试使用正确格式的私钥并用\n. 但是,这会进一步中断工作流程,并且不会在容器内使用 printenv 作为所需的多行变量出现。

docker-compose.yml

myservice:
  build: .
  environment:
    - SSH_KEY
    - SINGLE_LINE_VALUE
Run Code Online (Sandbox Code Playgroud)

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

SINGLE_LINE_VALUE=I Load just fine
SSH_KEY="---------------
ABCDEFGH
--------------------
"
Run Code Online (Sandbox Code Playgroud)

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

非常感谢任何想法。

jam*_*ing 11

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

myservice:
  build: .
  environment:
    SSH_KEY: >
      --------- WHATEVER ----------
      randomkeybase64thingforyourse
      rvice
      ------- END WHATEVER --------
Run Code Online (Sandbox Code Playgroud)

附带说明一下,您不必复制.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 --------
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记用第二个符号来转义美元符号,例如“$$”而不是“$”(因为“docker-compose”会动态更新这些符号)。另外,值得注意的是,您还可以使用“|”语法来保留换行符。 (3认同)

Jak*_*jny 3

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

.env

KEY="--------------- \n ABCDEFGH \n --------------------"
Run Code Online (Sandbox Code Playgroud)

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' "
Run Code Online (Sandbox Code Playgroud)

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

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