我如何将环境variables传递给Docker容器?
我是Docker的新手,目前还不清楚如何从容器访问外部数据库。 在连接string中硬编码的最好方法是什么?
# Dockerfile ENV DATABASE_URL amazon:rds/connection?string
您可以使用-e
标志将环境variables传递给您的容器。
一个启动脚本的例子:
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 [...]
如果你有很多环境variables,特别是如果它们是秘密的,你可以使用一个env文件 :
$ docker run --env-file ./env.list ubuntu bash
–env-file标志将一个文件名作为参数,并期望每行都是VAR = VAL格式,模仿传递给–env的参数。 注释行只需要以#
你可以使用docker docker run ..
命令来使用-e
参数,正如这里提到的和@errata所提到的那样。
但是,这种方法可能的缺点是您的凭据将显示在stream程列表中,并在其中运行。
为了使它更安全,你可以在configuration文件中写入你的凭证,并使用--env-file
来docker run
--env-file
。 然后,您可以控制该configuration文件的访问权限,以便其他人访问该机器将不会看到您的凭据。
如果您使用“docker-compose”作为启动容器的方法,实际上有一种将服务器上定义的环境variables传递给Docker容器的有用方法。
在你docker-compose.yml
文件中,假设你正在docker-compose.yml
一个基本的hapi-js容器,代码如下所示:
hapi_server: container_name: hapi_server image: node_image expose: - "3000"
假设您的docker项目所在的本地服务器有一个名为“NODE_DB_CONNECT”的环境variables,您希望将其传递到您的hapi-js容器,并且您希望其新名称为“HAPI_DB_CONNECT”。 然后在docker-compose.yml
文件中,将本地环境variables传递给容器,并将其重命名为:
hapi_server: container_name: hapi_server image: node_image environment: - HAPI_DB_CONNECT=${NODE_DB_CONNECT} expose: - "3000"
我希望这可以帮助您避免在容器中的任何文件中对数据库连接string进行硬编码!
使用-e
或–env值设置环境variables(默认[])。
一个启动脚本的例子:
docker run -e myhost='localhost' -it busybox sh
如果要从命令行使用多个环境,则在每个环境variables之前使用-e
标志。
例:
sudo docker run -d -t -i -e NAMESPACE='staging' -e PASSWORD='foo' busybox sh
注意:确保将容器名称放在环境variables之后,而不是之前。
如果您需要设置许多variables,请使用--env-file
标志
例如,
$ docker run --env-file ./my_env ubuntu bash
对于任何其他帮助,请查看Docker帮助:
$ docker run --help
官方文档: https : //docs.docker.com/compose/environment-variables/
对于Amazon AWS ECS / ECR,您应该通过专用S3存储桶pipe理您的环境variables( 特别是秘密 )。 请参阅博客文章如何使用Amazon S3和Dockerpipe理基于Amazon EC2容器服务的应用程序的秘密 。
使用docker-compose
,下面的例子展示了如何在docker-compose.yml中inheritanceshell envvariables,然后由docker docker-compose
调用Docker docker-compose
来构build图像。 我发现这有用,如果说在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
命令中指定环境variables:
docker-compose build docker-compose up