【问题标题】:Pass array from .env to docker-compose.yml to Dockerfile to bash script将数组从 .env 传递到 docker-compose.yml 到 Dockerfile 到 bash 脚本
【发布时间】:2019-12-03 12:43:21
【问题描述】:

我创建了一个自定义 docker 容器,它调用了一个启动脚本。该脚本需要一些数据,这些数据存储在我的.env 文件中。

所有文件所需的所有变量都存储在.env 中,这就是我想要保留它的地方。我可以以这种方式传递变量而不会出错...只是 arrays 我无法正确传递。

.env:

FOO=1                # blah
BAR='bar'            # this does blah
MYARRAY=(
  hello              # blah
  world              # blah
)

docker-compose.yml:

mycontainer:
  env_file: .env
  build:
    context: .
    args:                           # pass variables into dockerfile
      FOO: ${FOO}
      MYARRAY: ${MYARRAY}

Dockerfile:

FROM some_app
ARG FOO
ARG MYARRAY
ENV \
  FOO=$FOO \
  MYARRAY=$MYARRAY                # pass variables into script
CMD [ "myscript.sh" ]

myscript.sh:

#!/bin/bash
set -Eeuo pipefail
echo "$FOO"                                        # works
for i in "${MYARRAY[@]}"; do echo "$i"; done       # <---- problem is here

数组在脚本中没有完整地到达 - 它以"(" 到达。这是因为它是从 ini 到 yaml 到 dockerfile 语法到 bash 的“翻译”。

如何对.env 中的内容进行转义/格式化,以便正确到达 bash 脚本?

【问题讨论】:

    标签: linux bash docker docker-compose yaml


    【解决方案1】:

    使用declare -p 输出并将数组作为纯文本传输。

    MYARRAY=(hello world)
    

    稍后在您的脚本中:

    declare -a MYARRAY="$MYARRAY"
    printf "%s\n" "${MYARRAY[@]}"
    

    Bash 数组是 bash 的扩展,其他任何地方都不支持它。环境变量只能包含文本、值。使用declare -p 正确转义和提取的文本(甚至使用declare -f 的函数)传递任何更复杂的内容。对于困难的情况,您可以在printf "%q" 的帮助下准备(甚至从某些脚本自动生成)数组:

    hardarray=('!@#\''\' "space space")
    printf "%q" "$(declare -p hardarray | cut -d= -f2-)" # put the output in .env file
    # then add in your .env file:
    hardarray=\(\[0\]=\"\!@#\\\\\\\\\"\ \[1\]=\"space\ space\"\)
    # then later read the array in your script:
    declare -a hardarray="$hardarray"
    

    我相信在 docker-compose 中通过 env_file 传递多行字符串是不可能的。我只是建议从 shell 脚本生成它(但遗憾的是,这为构建过程增加了另一个阶段)。

    【讨论】:

    • 谢谢!这在我将数组声明为单行字符串 MYARRAY="( hello world )" 时有效,但当它像上面的代码中那样为多行时不起作用。它需要是多行的,因为它很大并且还需要注释。我可以将您的方法与多行数组/字符串一起使用吗?
    • 你必须检查一下,docker 有不直观的评论解析。所以像......编辑过的东西。我认为您不能将多行放在一起 env_file 。最佳解决方案 - 只需在运行 docker 之前从 bash 脚本生成带有 declare -p 的 .env 文件......不,For example if the value is surrounded by quotes (as is often the case of shell variables), the quotes are included in the value passed to Compose. - 所以你必须删除引号,我相信不可能将多行变量放在 .env_file 中。
    • 尝试了您的更新,谢谢...它仍然无法正常工作。多线是真正的问题。我还尝试在每行末尾使用 `foo`,但这没有帮助。我会查看 docker 手册,也许这是不可能的 :( 再次感谢
    • 这可能是不可能的...抱歉浪费您的时间!
    • 刚刚检查了docker-compose repo,看起来.env 中的多行字符串不受支持-引擎只读取第一行!! :-(
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 2018-08-14
    • 2019-05-27
    • 2020-02-08
    • 1970-01-01
    • 2018-02-27
    • 2019-03-11
    • 2013-04-07
    相关资源
    最近更新 更多