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

在docker compose中使用.env文件中的多行值,docker,docker-compose,environment-variables,Docker,Docker Compose,Environment Variables,我有一个安装程序,它将一些值输出到.env文件,供docker compose使用。到目前为止,所有这些都有效,但SSH密钥似乎无法使用 到目前为止,我已尝试使用格式正确的私钥,并将新行替换为\n。但是,这会使工作流程进一步中断,并且不会在容器中使用printenv作为所需的多行变量出现 docker-compose.yml myservice: build: . environment: - SSH_KEY - SINGLE_LINE_VALUE version: '

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

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

docker-compose.yml

myservice:
  build: .
  environment:
    - SSH_KEY
    - SINGLE_LINE_VALUE
version: '3'

services:
  test:
    image: ubuntu
    environment:
      - SSH_KEY=$KEY
    command: bash -c "echo \"$${SSH_KEY}\" | perl -pe 's/\\\n/\n/g' "
.env(忽略明显损坏的sshkey)

在容器运行时,SSH_密钥的环境值仅为“---------------


非常感谢任何想法。

也许不是最好的解决方案,但至少是可行的

环境署署长

docker-compose.yml

myservice:
  build: .
  environment:
    - SSH_KEY
    - SINGLE_LINE_VALUE
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 replace是必需的,因为docker compose将自动向新行字符添加转义斜杠。

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

myservice:
  build: .
  environment:
    SSH_KEY: >
      --------- WHATEVER ----------
      randomkeybase64thingforyourse
      rvice
      ------- END WHATEVER --------
另外,您不必在
环境
部分中复制
.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 --------

希望我能让它不知道正在运行的映像。我的用例是使用JCasC插件将环境变量加载到jenkins中,JCasC插件使用环境变量。然而,我认为使用tr的潜在解决方案可能也可行,因为它不需要perl。它需要用替换的新行加载密钥在主机系统上使用“.”时,至少echo“|tr”“\n”将密钥格式设置得足够近,但又很粗糙。不要忘记使用第二个符号来转义美元符号,例如,
$
而不是
$
(因为
docker compose
动态更新这些符号)。另外,值得注意的是,您还可以使用
|
语法来保留换行符。这是否回答了您的问题?