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

# 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/

其他回答

使用-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/

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

web:
 env_file:
  - web-variables.env

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

有一个很好的方法可以将主机环境变量输送到Docker容器中:

env > env_file && docker run --env-file env_file image_name

要非常小心地使用这种技术,因为env > env_file会将所有主机env变量转储到env_file中,并使它们在运行的容器中可访问。

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

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

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

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