lon*_*nix 4 linux bash yaml docker docker-compose
我创建了一个自定义 Docker 容器,它调用启动脚本。该脚本需要一些数据,这些数据存储在我的.env文件中。
所有文件所需的所有变量都存储在 中.env,这就是我想要保存它的地方。我可以通过这种方式传递变量而不会出现错误...这只是我无法正确传递的数组。
.env:
FOO=1 # blah
BAR='bar' # this does blah
MYARRAY=(
hello # blah
world # blah
)
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml:
mycontainer:
env_file: .env
build:
context: .
args: # pass variables into dockerfile
FOO: ${FOO}
MYARRAY: ${MYARRAY}
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM some_app
ARG FOO
ARG MYARRAY
ENV \
FOO=$FOO \
MYARRAY=$MYARRAY # pass variables into script
CMD [ "myscript.sh" ]
Run Code Online (Sandbox Code Playgroud)
myscript.sh:
FOO=1 # blah
BAR='bar' # this does blah
MYARRAY=(
hello # blah
world # blah
)
Run Code Online (Sandbox Code Playgroud)
该数组在脚本中并未完整到达 - 它以"(". 这是因为它是从 ini 到 yaml 到 dockerfile 语法“翻译”到 bash 的。
如何转义/格式化这些内容,.env以便它正确到达 bash 脚本?
使用declare -p输出并将数组作为纯文本传输。
MYARRAY=(hello world)
Run Code Online (Sandbox Code Playgroud)
稍后在您的脚本中:
declare -a MYARRAY="$MYARRAY"
printf "%s\n" "${MYARRAY[@]}"
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
我相信在 docker-compose 中通过 env_file 传递多行字符串是不可能的。我只是建议从 shell 脚本生成它(但遗憾的是,这为构建过程增加了另一个阶段)。
| 归档时间: |
|
| 查看次数: |
4232 次 |
| 最近记录: |