我正在尝试使用单个Dockerfile
,几个docker- compose
文件和几个envoronment_variables
文件为多个环境创建配置。我需要它为每个环境使用具有python依赖关系的其他文件。
假设我们web
在两个环境中创建服务:development
和production
。为此,我创建了以下文件结构:
docker-compose-dev.yml
docker-compose-prod.yml
envs/
dev.env
prod.env
web/
Dockerfile
requirements_dev.txt
requirements_prod.txt
目的是在容器的过程中实例化requirements_*.txt
文件的专有名称。根据文档,我尝试了这种天真的方法,这种方法似乎不起作用:Dockerfile``build
REQUIREMENTS=requirements_dev.txt
REQUIREMENTS=requirements_prod.txt
FROM python:3.5
ENV PYTHONUNBUFFERED 1
ENV APP_ROOT /usr/src/app
...
COPY $REQUIREMENTS $APP_ROOT/
RUN pip install -r $APP_ROOT/$REQUIREMENTS
docker-compose
配置中导入相应的定义: version: '2'
services:
web:
build: ./web
env_file:
- envs/dev.env # in docker-compose-dev.yml
- envs/prod.env # in docker-compose-prod.yml
...
当我运行时docker-compose up --build docker-compose- dev.yml
,该$REQUIREMENTS
变量未在构建过程中定义。
在docker-compose
文档中有关于此的注释:
注意:如果您的服务指定了构建选项,则在构建过程中不会自动显示环境文件中定义的变量。 使用build的args子选项来定义构建时环境变量。
但是要使用中的ARG
选项Dockerfile
,例如ARG REQUIREMENTS
,需要在中使用相应的args
选项docker- compose
,如下所示:
services:
web:
build:
context: ./web
args:
- REQUIREMENTS
但是,使用此配置,我的测试也失败了,因为根据文档,REQUIREMENTS
Dockerfile中变量的值取自
运行Compose的环境
因此,它从我的外壳中获取价值,而不是从中获取价值envs/dev.env
。
所以我的问题是:
是否有可能通过环境变量 来自
env_file
于docker-compose
对Dockerfile
在构建时没有在我的壳局部设置变量?
您的docker-compose.yml应该如下所示:
version: '2'
services:
web:
build:
context: ./web
args:
REQUIREMENTS: "requirements_dev.txt"
您的Dockerfile应该使用ARG
如下方式定义构建参数:
FROM python:3.5
ENV PYTHONUNBUFFERED 1
ENV APP_ROOT /usr/src/app
ARG REQUIREMENTS
...
COPY $REQUIREMENTS $APP_ROOT/
RUN pip install -r $APP_ROOT/$REQUIREMENTS
我对此进行了验证,并在Github上创建了一个缩小的功能演示:
https://github.com/jannikweichert/stackoverflow-41747843
这个码头商。yml: 使用这个。env文件(它位于根文件夹中,如docker-compose.yml和Dockerfile): 和节点服务器启动中的以下代码: 我真的更喜欢使用第一种或第二种方法 docker版本:18.06.1-CE docker-compose版本:1.19.0
我想对我的vuejs应用程序进行dockerize,并从docker-compose文件中传递环境变量。 我怀疑应用程序只在构建阶段获得环境变量,因此它不会从Docker-Compose获得环境变量。 Docker-Compose: 在构建阶段之后,有什么方法可以将环境变量传递给web应用程序吗?
在Docker主机上,我有: app.js DockerFile: 我还尝试在docker-compose.yml中使用,如下所示,这同样只使它在运行时可用,而不是在构建时可用: 请指教,我怎样才能使它以最不费解的方式工作?
问题内容: 我是Docker的新手,目前尚不清楚如何从容器访问外部数据库。硬编码连接字符串的最佳方法是吗? 问题答案: 您可以使用该标志将环境变量传递到您的容器。 启动脚本的示例: 或者,如果您不希望在命令行中使用,等显示该值,则可以直接从当前环境中获取该值,如果您不带: 如果您有许多环境变量,尤其是要保密的话,可以使用env文件: --env-file标志将文件名作为参数,并期望每行采用VAR
我是Docker的新手,不清楚如何从容器访问外部数据库。是在连接字符串中硬编码的最佳方法吗?
问题内容: 我正在尝试设置一个postgres容器,并希望使用以下命令设置postgres登录名: 所以我像这样创建了docker-compose.yml 我还尝试了将环境变量声明为db部分的其他语法: 但是这些选项似乎都不起作用,因为无论出于什么原因,无论何时我尝试使用各种连接字符串连接到postgres数据库: 与抱怨没有用户数据库相反,它们都给我身份验证失败。 问题答案: 您收到的身份验证错