如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?

# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string

当前回答

如果你使用“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-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

使用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

我遇到的问题是,我把——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...]

码头工人运行

你可以在docker run ..这里提到的和勘误表中提到的命令。

然而,这种方法可能存在的缺点是,您的凭据将显示在您运行它的进程列表中。

为了让它更安全,你可以把你的凭证写在一个配置文件中,并像这里提到的那样使用——env-file运行docker。然后,您可以控制对该配置文件的访问,以便其他有权访问该机器的人不会看到您的凭据。