如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?

# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string

当前回答

使用jq将环境转换为JSON:

env_as_json=`jq -c -n env`
docker run -e HOST_ENV="$env_as_json" <image>

这需要jq 1.6或更新版本。

这将主机环境作为一个JSON文件,本质上就像Dockerfile中的那样:

ENV HOST_ENV  (all environment from the host as JSON)

其他回答

您可以使用-e或——env作为参数,后面跟着键-值格式。

例如:

docker build -f file_name -e MYSQL_ROOT_PASSWORD=root

假设你有一个启动MySQL数据库容器的用例,所以你需要传递以下变量

docker run -dit --name db1 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=mydb -e MYSQL_USER=jack -e MYSQL_PASSWORD=redhat mysql:5.7

运行——rm -it——env-file <(bash -c 'env | grep <你的env数据>') 是一种grep存储在.env中的数据并将它们传递给Docker的方法,没有任何不安全的存储(所以你不能只查看Docker历史并获取密钥)。

假设你的。env中有很多AWS的东西,就像这样:

AWS_ACCESS_KEY: xxxxxxx
AWS_SECRET: xxxxxx
AWS_REGION: xxxxxx

使用docker run——rm -it——env-file <(bash -c 'env | grep AWS_')将抓取所有文件并安全地传递给容器内的用户。

使用docker run设置环境变量的文档有一些不一致。

网上的参考资料说了一件事:

——env, -e设置环境变量

manpage略有不同:

-e,——env=[]设置环境变量

docker run——help再次给出其他东西:

-e,——env list设置环境变量


在任何可用的文档中都不一定清楚的东西:

-e或——env后面的尾随空格可以用=替换,如果是-e,则可以完全省略:

$ docker run -it -ekey=value:1234 ubuntu env
key=value:1234

这是我通过反复试验(以及上面的线索)发现的一个技巧……

如果你得到错误:

未知标志:——env

然后你可能会发现使用等号——env会很有帮助,例如:

--env=key=value:1234

启动容器的不同方法可能有不同的解析场景。


当在各种组合配置中使用Docker时,例如Visual Studio Code devcontainer,这些技巧可能会有所帮助。json,其中runArgs数组中不允许有空格。

另一种方法是使用/usr/bin/env的功能:

docker run ubuntu env DEBUG=1 path/to/script.sh