如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?
# 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或——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/
运行——rm -it——env-file <(bash -c 'env | grep <你的env数据>') 是一种grep存储在.env中的数据并将它们传递给Docker的方法,没有任何不安全的存储(所以你不能只查看Docker历史并获取密钥)。
假设你的。env中有很多AWS的东西,就像这样:
AWS_ACCESS_KEY: xxxxxxx
AWS_SECRET: xxxxxx
AWS_REGION: xxxxxx
使用docker run——rm -it——env-file <(bash -c 'env | grep AWS_')将抓取所有文件并安全地传递给容器内的用户。
如果你使用“Docker -compose”作为旋转容器的方法,实际上有一种有用的方法可以将服务器上定义的环境变量传递给Docker容器。
在你码头式的写作中。Yml文件,让我们说你正在旋转一个基本的happi -js容器,代码看起来像:
hapi_server:
container_name: hapi_server
image: node_image
expose:
- "3000"
假设你的docker项目所在的本地服务器有一个名为“NODE_DB_CONNECT”的环境变量,你想把它传递给你的hapi-js容器,你想让它的新名称为“HAPI_DB_CONNECT”。然后在docker-compose。Yml文件中,你可以将本地环境变量传递给容器,并像这样重命名它:
hapi_server:
container_name: hapi_server
image: node_image
environment:
- HAPI_DB_CONNECT=${NODE_DB_CONNECT}
expose:
- "3000"
我希望这能帮助您避免在容器中的任何文件中硬编码数据库连接字符串!
使用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数组中不允许有空格。
使用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