Linux 将数组从.env传递到docker-compose.yml,再传递到Dockerfile,再传递到bash脚本
我创建了一个自定义docker容器,它调用启动脚本。该脚本需要一些数据,这些数据存储在我的Linux 将数组从.env传递到docker-compose.yml,再传递到Dockerfile,再传递到bash脚本,linux,bash,docker,docker-compose,yaml,Linux,Bash,Docker,Docker Compose,Yaml,我创建了一个自定义docker容器,它调用启动脚本。该脚本需要一些数据,这些数据存储在我的.env文件中 所有文件所需的所有变量都存储在.env中,这就是我想要保存它的地方。我可以通过这种方式传递变量而不会出错。。。只有数组我不能正确通过 .env: FOO=1 # blah BAR='bar' # this does blah MYARRAY=( hello # blah world
.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
设置-Eeuo管道失败
echo“$FOO”作品
对于“${MYARRAY[@]}”中的i;做回显“$i”;完成#使用声明-p
输出并以纯文本形式传输数组
MYARRAY=(hello world)
稍后在脚本中:
declare -a MYARRAY="$MYARRAY"
printf "%s\n" "${MYARRAY[@]}"
Bash数组是Bash的一个扩展,其他任何地方都不支持它。环境变量只能包含文本和值。使用declare-p
(甚至使用declare-f
)正确转义和提取的文本传递任何更复杂的内容。对于困难的情况,您可以在printf“%q”
的帮助下准备(甚至从某些脚本自动生成)数组:
我相信在docker compose中通过env_文件传递多行字符串是不可能的。我建议从shell脚本生成它(但遗憾的是,这为构建过程增加了另一个阶段)。谢谢!当我将数组声明为一个单行字符串MYARRAY=“(hello world)”
时,它就起作用了,但当它像上面的代码一样是多行时,它就不起作用了。它需要是多行的,因为它是巨大的,还需要注释。我可以用你的方法处理多行数组/字符串吗?你必须检查一下,docker的注释解析不直观。所以有点像。。。编辑。我认为不能将多行放在env_文件中。最佳解决方案-在运行docker之前,只需从bash脚本中使用declare-p
生成.env文件。。。Ach no,例如,如果值被引号包围(通常是shell变量),则引号将包含在传递给Compose的值中。
-因此您必须删除引号,并且我认为不可能将多行变量放入.env_文件中。请尝试更新,谢谢。。。它仍然不起作用。多行是真正的问题。我还试着在每一行的末尾使用'foo',但没有用。我将查看docker手册,可能这是不可能的:(再次感谢这可能是不可能的…很抱歉浪费您的时间!刚刚检查了,看起来像中的多行字符串。不支持env
-引擎只读取第一行!!:-(
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"