当前位置: 首页 > 知识库问答 >
问题:

在构建dockerfile期间传递主机环境变量

郏兴贤
2023-03-14

我正在尝试将服务器URL传递给在Docker容器中运行的React应用程序。它在应用程序中发送HTTP请求时使用,访问方式如下:process.env.server_urlserver_url。这在主机上存储为en环境变量。

我尝试过直接在我的does文件中设置变量:< code > ENV server _ URL = $ { server _ URL } ,我认为这不起作用,因为< code>${server_url}是针对does文件中定义的< code>ARGS的。

相反,我试图在构建时将其作为参数传递,正如这里提到的:在构建时将环境变量传递给Dockerfile:docker Build--buil-argserver_url=$server_url。但是,试图重新创建公认答案中给出的内容:

FROM node:9 as build-deps

WORKDIR /temp

RUN echo $var1

ADD package*.json  ./
RUN npm install

ADD . ./

RUN npm run build

# Stage 2 - the production environment
FROM nginx:1.12-alpine

COPY --from=build-deps /temp/build /usr/share/nginx/html

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

运行dockerbuild--buildargvar1=hello.在STDOUT中产生空行。变量显然设置不正确。

相反,我尝试使用这里提到的docker compose将主机环境变量传递给dockerfile。这看似可行,< code > docker exec-it container-name printenv 实际上显示环境变量是存在的,但是当通过React访问时,它仍然是< code >未定义的。

实际上,我在React中获得a值的唯一方法是在docker文件中硬编码该值:< code > ENV server _ URL = 12 . 34 . 56 . 78 。

我很困惑,因为我希望 docker 撰写解决方案能够工作,因为实际上在图像中看到变量。我怀疑这可能与我的分层构建和使用 nginx 来提供 Web 应用程序有关,但恐怕我不知道为什么或如何解决这个问题。

任何帮助都很好,谢谢。

共有1个答案

禹智渊
2023-03-14

在传递给build命令之前,需要在Dockerfile中定义ARG。

因此var1仅在Dockerfile中可用,在App中不可用。

因此,要使其在您的应用程序中可用,您必须将 ARG 值传递给 ENV

ARG var1
RUN echo $var1
ENV server_url=$var1

或者,如果您希望在构建时错过传递一些默认值,则将其用作默认值。

FROM alpine
ARG var1=default_value
RUN echo $var1
 类似资料:
  • 问题内容: 如何将主机环境变量(例如用户名和主机名)传递给dockerfile? 例如,如果我的用户名是: 如何编写Docker文件以获得相同的输出? 问题答案: 我遇到了同样的问题。我的解决方案是在docker-compose.yml内部提供变量,因为yml支持使用环境变量。 我认为这对我来说是最有效的方式,因为我不喜欢在命令行中使用类似以下内容一遍又一遍地键入它 在容器中,声明将无效,将设置为

  • 我需要在Dockerfile中传递环境变量,如下所示。我可以知道做这件事的有效方法吗。我尝试使用构建参数 但它没有用。 这是我的 Dockerfile 所以当我运行我的docker容器时,我相信我不想向它发送任何环境变量。 请指教。

  • 在构建docker映像时,可以将环境变量作为文件传递给Dockerfile吗? 我按照这里的建议使用了,但由于我有多个参数,我更喜欢使用一个文件。 我也尝试使用方法,但我需要在构建时添加这些参数。 提前感谢。

  • 问题内容: 我写了一个使用两个参数的: 我写了一个for build: 我不想直接在compose文件中定义这些参数,因此我尝试在docker compose构建期间发送它们: 哪个没有用。我更改为将这些参数用作环境变量。所以我删除了几行: 和: 跑了; 仍然没有结果。 我还尝试将这些信息保存到文件中: 但是,似乎文件在构建时不会受到影响。他们只是参与运行时间。 编辑1: Docker版本不支持使

  • 因为我放在容器中的应用程序的bin名称可以更改(docker构建是更大构建的一部分,我很容易将正确的名称从一个构建传递到另一个构建)我想做这样的事情: < code >入口点["$PATH_TO_BIN"] 但由于没有外壳来评估,这通常会失败。理论上我可以去 但在这种情况下,我在执行时无法传递任何参数。 有没有可能在构建期间使用exec form并计算args或env变量(这样在运行时就不需要sh

  • 我已经尝试了几个小时,但不知道如何在构建过程中在 Dockerfile 中激活和切换 anaconda 环境 这是初始代码: 起初,Docker 中的 anaconda 会抱怨 shell 设置不正确,因此在 conda 创建命令之后,我添加了: 在构建docker映像后运行这3个命令是可行的(即在调用docker run container-name后交互运行),但由于某种原因,在构建容器时不起