在Dockerfile构建过程中传递主机环境变量

4
我试图将服务器URL传递给在Docker容器中运行的React应用程序。在应用程序中发送HTTP请求时使用它,可以像这样访问:process.env.server_url表示server_url。这存储为主机机器上的环境变量。
我尝试直接在Dockerfile中设置变量:ENV server_url=${server_url}。我认为这不起作用,因为${server_url}是在Dockerfile中定义的ARGS
相反,我尝试在构建时将其作为参数传递,就像这里提到的一样:Pass environment variables to Dockerfile during build timedocker 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,如这里提到的那样。这似乎有效,docker exec -it container-name printenv实际上显示环境变量已经存在,但是在React中仍然是undefined

我唯一成功让React获取值的方式是在Dockerfile中硬编码: ENV server_url=12.34.56.78

我很困惑,因为我预期docker compose解决方案能够起作用,因为实际上在镜像中看到了该变量。我怀疑这可能与我的分层构建和使用nginx提供web应用有关,但我不知道原因或如何解决。

希望得到任何帮助,谢谢。


可能是如何在Docker构建过程中设置环境变量的重复问题。 - LinPy
@LinPy 可能吧,不过我认为 Adiii 的回答更清晰地表明了你需要在 Dockerfile 中定义传递的 ARG。不确定这里在 SO 上的惯例是什么。 - vegarab
1个回答

3

在执行构建命令之前,您需要在 Dockerfile 中定义 ARG。

因此,var1 只能在 Dockerfile 中使用,在 App 中是不可用的。

因此,要使它在您的 App 中可用,必须将 ARG 值传递给 ENV

ARG var1
RUN echo $var1
ENV server_url=$var1

或者如果您希望在构建时未传递某些值时具有一些默认值,那么这将作为默认值运行。

FROM alpine
ARG var1=default_value
RUN echo $var1

谢谢!那个方法很管用。 我相信我应该无论如何都要使用docker-compose..如果不使用docker-compose,我该如何获得相同的结果而不是显式地传递构建参数? - vegarab
更新:只需为“ARG”设置一些默认值,您就不需要显式传递。 - Adiii
docker-compose build 还支持 --build-arg 作为参数,我知道了。谢谢。 - vegarab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接