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

# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string

当前回答

对于Amazon AWS ECS/ECR,您应该通过私有S3桶管理您的环境变量(特别是秘密变量)。请参阅如何使用Amazon S3和Docker管理基于Amazon EC2容器服务的应用程序的机密。

其他回答

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

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

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

如果你使用“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中的env_file:。Yaml文件,或者你可以复制。env文件到容器中,然后用扩展库读取。

Python项目

你可以使用python-dotenv包:

pip install python-dotenv

然后在代码中:

import os
from dotenv import load_dotenv

    load_dotenv()
    SECRET_KEY = os.getenv("MY_SECRET")

去项目

github.com/joho/godotenv包:

go get github.com/joho/godotenv

在你的代码中:

package main

import (
    "github.com/joho/godotenv"
    "log"
    "os"
)

func main() {
  err := godotenv.Load()
  if err != nil {
    log.Fatal("Error loading .env file")
  }

  secretKey := os.Getenv("MY_SECRET")
}

我们也可以使用-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')

运行——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_')将抓取所有文件并安全地传递给容器内的用户。