如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
当前回答
使用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)
其他回答
使用docker-compose,你可以在docker-compose中继承env变量。yml和docker-compose调用的任何Dockerfile来构建映像。当Dockerfile RUN命令应该执行特定于环境的命令时,这很有用。
(您的shell已经在环境中存在RAILS_ENV=development)
docker-compose.yml:
version: '3.1'
services:
my-service:
build:
#$RAILS_ENV is referencing the shell environment RAILS_ENV variable
#and passing it to the Dockerfile ARG RAILS_ENV
#the syntax below ensures that the RAILS_ENV arg will default to
#production if empty.
#note that is dockerfile: is not specified it assumes file name: Dockerfile
context: .
args:
- RAILS_ENV=${RAILS_ENV:-production}
environment:
- RAILS_ENV=${RAILS_ENV:-production}
Dockerfile:
FROM ruby:2.3.4
#give ARG RAILS_ENV a default value = production
ARG RAILS_ENV=production
#assign the $RAILS_ENV arg to the RAILS_ENV ENV so that it can be accessed
#by the subsequent RUN call within the container
ENV RAILS_ENV $RAILS_ENV
#the subsequent RUN call accesses the RAILS_ENV ENV variable within the container
RUN if [ "$RAILS_ENV" = "production" ] ; then echo "production env"; else echo "non-production env: $RAILS_ENV"; fi
这样,我就不需要在文件或docker-compose build/up命令中指定环境变量:
docker-compose build
docker-compose up
对于Amazon AWS ECS/ECR,您应该通过私有S3桶管理您的环境变量(特别是秘密变量)。请参阅如何使用Amazon S3和Docker管理基于Amazon EC2容器服务的应用程序的机密。
我们也可以使用-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')
使用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数组中不允许有空格。
另一种方法是使用/usr/bin/env的功能:
docker run ubuntu env DEBUG=1 path/to/script.sh