如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
当前回答
使用-e或——env value设置环境变量(默认[])。
一个启动脚本的例子:
docker run -e myhost='localhost' -it busybox sh
如果您想从命令行使用多个环境,那么在每个环境变量之前使用-e标志。
例子:
sudo docker run -d -t -i -e NAMESPACE='staging' -e PASSWORD='foo' busybox sh
注意:请确保将容器名称放在环境变量之后,而不是之前。
如果你需要设置很多变量,使用——env-file标志
例如,
$ docker run --env-file ./my_env ubuntu bash
对于任何其他帮助,查看Docker帮助:
$ docker run --help
官方文档: https://docs.docker.com/compose/environment-variables/
其他回答
如果您在本地的env.sh中有环境变量,并且希望在容器启动时设置它,您可以尝试
COPY env.sh /env.sh
COPY <filename>.jar /<filename>.jar
ENTRYPOINT ["/bin/bash" , "-c", "source /env.sh && printenv && java -jar /<filename>.jar"]
该命令将使用bash shell启动容器(我想使用bash shell,因为source是bash命令),获取env.sh文件(设置环境变量)并执行jar文件。
env.sh是这样的,
#!/bin/bash
export FOO="BAR"
export DB_NAME="DATABASE_NAME"
我添加printenv命令只是为了测试实际的源命令是否有效。您应该在确认源命令正常工作时删除它,否则环境变量将出现在docker日志中。
另一种方法是使用/usr/bin/env的功能:
docker run ubuntu env DEBUG=1 path/to/script.sh
运行——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-file运行docker。然后,您可以控制对该配置文件的访问,以便其他有权访问该机器的人不会看到您的凭据。
使用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数组中不允许有空格。