Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将数组从.env传递到docker-compose.yml,再传递到Dockerfile,再传递到bash脚本_Linux_Bash_Docker_Docker Compose_Yaml - Fatal编程技术网

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

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

我创建了一个自定义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
设置-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"