c# - 来自 .env 和/或 docker-compose 的环境变量未在 Dockerfile CMD 中替换

标签 c# docker docker-compose dockerfile

我正在尝试将几个环境变量从项目根目录中的 .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/

相关文章:

mongodb - db.createUser未在docker安装程序的mongodb中创建任何用户

docker 组成 : ensure volume mounted before running CMD

docker stack deploy 不会删除当前 yaml compose 文件中未声明的服务

c# - List.Sort(自定义排序...)

c# - 使用 UrlHelper 进行依赖注入(inject)

c# - 禁止浏览 WCF svc 文件?

c# - 通过单击按钮将焦点设置到另一个控件

docker - 使用 ansible 部署最新的 docker 容器

amazon-web-services - 如何将Kubernetes与现有的AWS ALB集成?

未安装/加载/启用 PHP 扩展,使用官方 PHP docker 镜像