我如何将环境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-filedocker 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