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

# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string

当前回答

下面是我解决这个问题的方法:

docker run --rm -ti -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_SESSION_TOKEN -e AWS_SECURITY_TOKEN amazon/aws-cli s3 ls

再举一个例子:

export VAR1=value1
export VAR2=value2

docker run --env VAR1 --env VAR2 ubuntu env | grep VAR

输出:

VAR1=value1
VAR2=value2

其他回答

您可以使用-e或——env作为参数,后面跟着键-值格式。

例如:

docker build -f file_name -e MYSQL_ROOT_PASSWORD=root

如果您在本地的env.sh中有环境变量,并且希望在容器启动时设置它,您可以尝试

COPY env.sh /env.sh
COPY <filename>.jar /<filename>.jar
ENTRYPOINT ["/bin/bash" , "-c", "source /env.sh && printenv && java -jar /<filename>.jar"]

该命令将使用bash shell启动容器(我想使用bash shell,因为source是bash命令),获取env.sh文件(设置环境变量)并执行jar文件。

env.sh是这样的,

#!/bin/bash
export FOO="BAR"
export DB_NAME="DATABASE_NAME"

我添加printenv命令只是为了测试实际的源命令是否有效。您应该在确认源命令正常工作时删除它,否则环境变量将出现在docker日志中。

要将环境导入到容器中,可以使用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或——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/

假设你有一个启动MySQL数据库容器的用例,所以你需要传递以下变量

docker run -dit --name db1 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=mydb -e MYSQL_USER=jack -e MYSQL_PASSWORD=redhat mysql:5.7