【发布时间】:2020-12-17 22:08:37
【问题描述】:
docker 确实让我很困惑.... 我正在尝试使用“环境”变量以及 .env 文件将变量传递到将要创建的容器中。可惜没有成功。
我的设置是什么:
docker-compose.yml
# dockerfile version 3.8 -> 18.07.2020
version: "3.8"
# services basicly means scalable amount of containers
services:
testalpine:
image: testenvalpine
build:
context: .
dockerfile: test-dockerfile
args:
- DB_NAME=nextcloud
- DB_USER=nextcloud
# todo only use https and self sign certificate
ports:
- "80:80"
environment:
- env1=hello
- env2=world
networks:
- nextcloudnetwork
# todo include redis and mariadb
networks:
nextcloudnetwork:
# std driver seems to be overlay?
driver: overlay
Docker 文件: 测试dockerfile
FROM alpine:latest
LABEL maintainer="xddq <donthavemyownemailyet:(((>"
ARG DB_NAME=default
ARG DB_USER=default
ENV env1=dockerfile env2=$DB_NAME
ENTRYPOINT [ "sh", "-c", \
"echo DB_NAME: $DB_NAME DB_USER: $DB_USER env1: $env1 env2: $env2" ]
我的 .env 文件
DB_NAME=nextcloud
DB_USER=nextcloud
我预期的输出:
DB_NAME:nextcloud DB_USER: nextcloud env1: hello env2:nextcloud
我得到的输出:
DB_NAME: DB_USER: env1: dockerfile env2: nextcloud
这是否意味着 docker-compose 中的“.env”和 ENV 变量对于将要创建的容器内的 env 变量完全没有用处?我的意思是我只能使用 ARG 变量得到任何结果..? :/
问候
【问题讨论】:
-
我认为您的困惑在于
ARG并假设它在运行时填充环境。ARG仅在构建时填充环境变量,并用于在构建映像时将变量传递给容器步骤。.env文件只会覆盖容器中的ENV或撰写文件中的environment映射。 -
嗯,这不是关于 ARG,而是更多关于 ENV。当我在 .env 文件中传递值时,我仍然必须将 key:ARG value:ENV 传递给 dockerfile,以便稍后在我的容器中访问 env 变量。这很令人困惑。我认为无论我在做什么,在 docker-compose 中设置的 ENV 变量都可以在我完成的容器中使用。但是 docker-compose 中的 ENV 变量似乎只能在 docker-compose 中使用。
-
他们可以。但在您的示例中,您期望的输出取决于
DB_NAME和DB_USER,它们是构建时间ARG,并且在运行时始终为空白。
标签: docker docker-compose environment-variables arguments devops