繁体   English   中英

将数组从 .env 传递到 docker-compose.yml 到 Dockerfile 到 bash 脚本

[英]Pass array from .env to docker-compose.yml to Dockerfile to bash script

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

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

.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 脚本?

使用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 脚本生成它(但遗憾的是,这为构建过程增加了另一个阶段)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM