linux - 将数组从 .env 传递到 docker-compose.yml 到 Dockerfile 到 bash 脚本
问题描述
我创建了一个自定义 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 脚本生成它(但遗憾的是,这为构建过程增加了另一个阶段)。
推荐阅读
- android - 如何在 ExoPlayer 的 recyclerview 中自动播放第一个视频
- wordpress - Wordpress gutenberg 按自定义帖子类型获取帖子
- android-studio - Huawei Toolkit 无法分析我的项目
- amazon-web-services - quicksight 数据集无法从数据源导入数据以及使用 createDataSet api 创建摄取问题数据集的问题
- c# - 设置窗口大小以适应内容,但阻止窗口宽度超出屏幕宽度
- python - Pandas 系列除以另一个系列,除法前四舍五入到小数点后两位
- javascript - Pub-Sub 模式和消息代理,如何确保所有订阅者完成对事件的处理
- kotlin - Kotlin 中的“val XXX = Class { ...”是什么意思?
- windows - 什么是信托提供者?
- python - 迭代数据框列