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

bcs8qyzn  于 2023-06-21  发布在  Docker
关注(0)|答案(6)|浏览(236)

我有一个安装程序,它将一些值输出到一个. 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的环境值只是"---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
任何想法非常赞赏。

yqkkidmi

yqkkidmi1#

如果您不介意不使用.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 --------
7xzttuei

7xzttuei2#

也许不是最好的解决方案,但至少工作。
.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 replace是必需的,因为docker-compose会自动添加转义斜杠到新的行字符。

wnrlj8wa

wnrlj8wa3#

根据dotenv的文档(link),它用于解析Docker Compose中的envfiles,应该使用双引号和new-lines(\n)来实现解析后的新行。
示例:

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

z4bn682m4#

我在尝试向我的docker.env文件添加证书时遇到了这个问题,它不会被正确拾取。
在.env文件中有这样的不工作

CERTIFICATE=MIIC5DCCAk2gAwIBAgIJAKgUiZPOajC0MA0GCSqGSIb3DQEBBAUAMFYxCzAJBgNV
BAYTAkRLMRMwEQYDVQQIEwpTb21lLVN0YXRlMQ8wDQYDVQQHEwZBYXJodXMxITAf
...

成功(注意\n):

CERTIFICATE=MIIC5DCCAk2gAwIBAgIJAKgUiZPOajC0MA0GCSqGSIb3DQEBBAUAMFYxCzAJBgNV\nBAYTAkRLMRMwEQYDVQQIEwpTb21lLVN0YXRlMQ8wDQYDVQQHEwZBYXJodXMxITAf...
c86crjj0

c86crjj05#

我也遇到了同样的问题。Docker无法读取.env文件中的换行符。我的解决方案是将. env中的每个换行符替换为“%”。在我的源代码中,我得到了环境变量,并将每个“%”替换为一个换行符。
这不是最优雅的解决方案,但它有效。

h9vpoimq

h9vpoimq6#

我已经管理它与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
...

相关问题