如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
当前回答
假设你有一个启动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
其他回答
有一个很好的方法可以将主机环境变量输送到Docker容器中:
env > env_file && docker run --env-file env_file image_name
要非常小心地使用这种技术,因为env > env_file会将所有主机env变量转储到env_file中,并使它们在运行的容器中可访问。
另一种方法是使用/usr/bin/env的功能:
docker run ubuntu env DEBUG=1 path/to/script.sh
要将环境导入到容器中,可以使用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")
}
如果您在本地的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 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