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

# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string

当前回答

对于Amazon AWS ECS/ECR,您应该通过私有S3桶管理您的环境变量(特别是秘密变量)。请参阅如何使用Amazon S3和Docker管理基于Amazon EC2容器服务的应用程序的机密。

其他回答

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

web:
 env_file:
  - web-variables.env

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

您可以使用-e标志将环境变量传递给容器。

一个启动脚本的例子:

sudo docker run -d -t -i -e REDIS_NAMESPACE='staging' \ 
-e POSTGRES_ENV_POSTGRES_PASSWORD='foo' \
-e POSTGRES_ENV_POSTGRES_USER='bar' \
-e POSTGRES_ENV_DB_NAME='mysite_staging' \
-e POSTGRES_PORT_5432_TCP_ADDR='docker-db-1.hidden.us-east-1.rds.amazonaws.com' \
-e SITE_URL='staging.mysite.com' \
-p 80:80 \
--link redis:redis \  
--name container_name dockerhub_id/image_name

或者,如果你不想在命令行中显示这个值,它将被ps等显示,-e可以从当前环境中拉入这个值,如果你只给它不带=的话:

sudo PASSWORD='foo' docker run  [...] -e PASSWORD [...]

如果你有很多环境变量,特别是如果它们是秘密的,你可以使用env文件:

$ docker run --env-file ./env.list ubuntu bash

——env-file标志以文件名作为参数,并期望每行都是VAR=VAL格式,模拟传递给——env的参数。注释行只需加上#前缀

如果您在本地的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 run ..这里提到的和勘误表中提到的命令。

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

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

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

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