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

标签 docker docker-compose environment-variables

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

我尝试直接在 Dockerfile 中设置变量: 我认为 ENV server_url=${server_url} 不起作用,因为 ${server_url} 用于 Dockerfile 中定义的 ARGS

相反,我尝试将其作为构建时的参数传递,如此处所述:Pass environment variables to Dockerfile during build time :docker build --buil-arg server_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;"]

并运行docker build --build-arg var1=hello .在STDOUT中产生空行。该变量肯定没有正确设置。

我改为尝试使用此处提到的 docker compose Pass host environment variables to dockerfile 。这看起来可行,docker exec -it container-name printenv 实际上显示环境变量存在,但通过 React 访问时它仍然是undefined

我实际上能够在 React 中获取 a 值的唯一方法是通过在 Dockerfile 中硬编码该值:ENV server_url=12.34.56.78

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

任何帮助都会很好,谢谢。

最佳答案

您需要在传递给构建命令之前在 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

关于docker - 在 dockerfile 中构建期间传递主机环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57755017/

相关文章:

amazon-web-services - Amazon ECS错误:无法创建没有容器的任务定义

environment-variables - 将加载命令添加到 mach-o 二进制文件

c - 如何在我的 minishell 中处理 null 环境变量?

XCode 不识别环境变量

postgresql - 尝试访问数据库或从数据库获取数据时,用户的 PostgresQL 密码身份验证失败的问题?

docker - 使用 Docker 映射 Compute Engine 中的端口

docker - 将LoadRunner集成到Docker中

docker - 如何将命令附加到 docker-compose.yml 而不覆盖现有命令?

r - Docker in R 和/或 Packrat for Reproducible Science

docker - 如何在Docker中启动Mountebank?