如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
如何从容器访问外部数据库?在连接字符串中硬编码是最好的方法吗?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
当前回答
要将环境导入到容器中,可以使用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")
}
其他回答
使用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
另一种方法是使用/usr/bin/env的功能:
docker run ubuntu env DEBUG=1 path/to/script.sh
使用-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/
你可以在docker run ..这里提到的和勘误表中提到的命令。
然而,这种方法可能存在的缺点是,您的凭据将显示在您运行它的进程列表中。
为了让它更安全,你可以把你的凭证写在一个配置文件中,并像这里提到的那样使用——env-file运行docker。然后,您可以控制对该配置文件的访问,以便其他有权访问该机器的人不会看到您的凭据。
我遇到的问题是,我把——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...]
码头工人运行