如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
当前回答
为了通过docker-compose传递多个环境变量,一个环境文件也可以用在docker-compose文件中。
web:
env_file:
- web-variables.env
https://docs.docker.com/compose/environment-variables/#the-env_file-configuration-option
其他回答
我们也可以使用-e标志和$来使用主机环境变量:
在执行以下命令之前,需要导出(即设置)本地环境变量。
docker run -it -e MG_HOST=$MG_HOST \
-e MG_USER=$MG_USER \
-e MG_PASS=$MG_PASS \
-e MG_AUTH=$MG_AUTH \
-e MG_DB=$MG_DB \
-t image_tag_name_and_version
通过使用此方法,您可以使用给定的名称自动设置环境变量。在我的例子中,MG_HOST和MG_USER。
另外:
如果你正在使用Python,你可以通过以下方式访问Docker内部的这些环境变量:
import os
host = os.environ.get('MG_HOST')
username = os.environ.get('MG_USER')
password = os.environ.get('MG_PASS')
auth = os.environ.get('MG_AUTH')
database = os.environ.get('MG_DB')
我遇到的问题是,我把——env文件放在命令的末尾
docker run -it --rm -p 8080:80 imagename --env-file ./env.list
Fix
docker run --env-file ./env.list -it --rm -p 8080:80 imagename
出现这种情况的原因是docker run命令具有以下签名。您可以看到选项出现在图像名称之前。映像名称看起来像是一个选项,但它是run命令的一个参数。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
码头工人运行
如果您在本地的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日志中。
使用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)
对于Amazon AWS ECS/ECR,您应该通过私有S3桶管理您的环境变量(特别是秘密变量)。请参阅如何使用Amazon S3和Docker管理基于Amazon EC2容器服务的应用程序的机密。