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

# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string

当前回答

下面是我解决这个问题的方法:

docker run --rm -ti -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_SESSION_TOKEN -e AWS_SECURITY_TOKEN amazon/aws-cli s3 ls

再举一个例子:

export VAR1=value1
export VAR2=value2

docker run --env VAR1 --env VAR2 ubuntu env | grep VAR

输出:

VAR1=value1
VAR2=value2

其他回答

使用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数组中不允许有空格。

假设你有一个启动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

如果您在本地的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日志中。

为了通过docker-compose传递多个环境变量,一个环境文件也可以用在docker-compose文件中。

web:
 env_file:
  - web-variables.env

https://docs.docker.com/compose/environment-variables/#the-env_file-configuration-option

你可以在docker run ..这里提到的和勘误表中提到的命令。

然而,这种方法可能存在的缺点是,您的凭据将显示在您运行它的进程列表中。

为了让它更安全,你可以把你的凭证写在一个配置文件中,并像这里提到的那样使用——env-file运行docker。然后,您可以控制对该配置文件的访问,以便其他有权访问该机器的人不会看到您的凭据。