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

时间:2019-09-02 10:04:30

标签: docker docker-compose environment-variables

我正在尝试将服务器URL传递给在Docker容器中运行的React APP。它在应用程序中发送HTTP请求时使用,可通过以下方式访问:process.env.server_url for 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中产生一个空行。该变量肯定没有正确设置。

我改为尝试使用Pass host environment variables to dockerfile所述的docker compose。这似乎可行,docker exec -it container-name printenv实际上表明存在环境变量,但是通过React访问时它仍然是undefined

我实际上能够在React中获得值的唯一方法是对Dockerfile中的值进行硬编码:ENV server_url=12.34.56.78

我很困惑,因为我期望docker compose解决方案能够正常工作,因为实际上看到了图像中的变量。我怀疑这可能与我的分层构建以及使用Nginx来提供Web应用程序有关,但是恐怕我不知道为什么或如何解决此问题。

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

1 个答案:

答案 0 :(得分:2)

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