我正在尝试将几个环境变量从项目根目录中的 .env 文件传递到 Dockerfile 的 CMD。我已经阅读了 SO 上的许多其他类似问题,但没有任何效果。我做错了什么?
.env(在项目的根目录中)
TOKEN=AToken
DECK=ADeck
docker-compose.yml(在项目的根目录中)
version: "3"
services:
discord-initiative-savageworlds:
build:
context: .
environment:
- TOKEN=${TOKEN}
- DECK=${DECK}
和 Dockerfile(在项目的根目录中):
FROM ubuntu:latest
ARG TOKEN
ARG DECK
...Run Installers and Stuff...
COPY . .
RUN dotnet publish
RUN cd DiscordInitiative/bin/Debug/net5.0/publish
RUN echo "${TOKEN}"
CMD ./DiscordInitiative --token="${TOKEN}" --deck="${DECK}"
运行docker-compose up
成功构建项目,但是CMD显示环境变量没有被替换:
Step 12/13 : RUN echo "${TOKEN}"
---> Running in 7096ef978516
Removing intermediate container 7096ef978516
---> 6985b62bb75e
Step 13/13 : CMD ./DiscordInitiative --token="${TOKEN}" --deck="${DECK}"
这是在 GitHub 上的项目和分支 here .
感谢任何提示!
最佳答案
docker-compose 文件中的 .env 文件和 environment
指令是在运行时应用的 Docker Compose 概念,不适用于镜像构建。您的配置会将这些环境变量注入(inject)到构建的、正在运行的容器中,但它不会通知构建环境。
(编辑:经过深思熟虑,这可能是您真正想要的。)
您可以通过更改 docker-compose 来充分利用 Dockerfile 中的 ARG
指令:
version: "3"
services:
discord-initiative-savageworlds:
build:
context: .
args:
- TOKEN=${TOKEN}
- DECK=${DECK}
这将在构建时有效地设置您的“环境”,并使您的 Dockerfile 能够像上面粘贴的那样运行。
编辑:
我怀疑 Dockerfile 的编辑部分中可能有一些东西可能会引发问题。我们的评论线程中的 TL;DR 是您的 Dockerfile 也需要更改:
FROM ubuntu:latest
...Run Installers and Stuff...
COPY . .
RUN dotnet publish
RUN cd DiscordInitiative/bin/Debug/net5.0/publish
ARG TOKEN
ARG DECK
RUN echo "${TOKEN}"
CMD ./DiscordInitiative --token="${TOKEN}" --deck="${DECK}"
将这些 ARG
指令移动到尽可能靠近底部的位置,将它们从您的 docker-compose.yml 一堆其他 RUN
说明,以及类似的东西,有可能破坏中间容器状态。
编辑2:
但实际上,您所要求的是运行时容器中可用的变量(当 CMD
正在执行时)。因此,您的问题会让我相信您根本不需要 ARG
,并且您的容器会按预期运行。
此外,如果您消除 ARG
,您就可以摆脱 RUN echo ...
,因为在构建过程的那个时候它永远不会返回任何东西.
注入(inject) ARG
完全不是您想要对敏感值执行的操作,因为参数随后会成为图像层的一部分,并受到窥探。在运行时向环境注入(inject)敏感值的模式是更受欢迎的(尽管我不会说最喜欢)。
关于c# - 来自 .env 和/或 docker-compose 的环境变量未在 Dockerfile CMD 中替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69350993/