在内置dockerfile期间传递主机环境变量

在内置dockerfile期间传递主机环境变量,docker,docker-compose,environment-variables,Docker,Docker Compose,Environment Variables,我正在尝试将服务器URL传递给Docker容器中运行的React应用程序。它用于在应用程序中发送HTTP请求,访问方式如下:process.env.server\u urlfor server\u url。这将作为en环境变量存储在主机上 我已尝试直接在Dockerfile中设置变量: ENV-server\u-url=${server\u-url}我认为它不起作用,因为${server\u-url}用于Dockerfile中定义的参数 相反,我尝试将其作为build上的参数传递,正如这里提到的

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

我已尝试直接在Dockerfile中设置变量:
ENV-server\u-url=${server\u-url}
我认为它不起作用,因为
${server\u-url}
用于Dockerfile中定义的
参数

相反,我尝试将其作为build上的参数传递,正如这里提到的:
docker build--buil arg server\u url=$server\u 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容器名printenv
实际上显示环境变量存在,但通过React访问时仍然是
未定义的

实际上,我能够在React中获得a值的唯一方法是在Dockerfile中硬编码该值:
ENV server\u url=12.34.56.78

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


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

在传递到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

非常感谢。这就成功了。否则,我相信无论如何我都应该使用docker compose。。如果不使用docker compose显式传递构建参数,我将如何获得相同的结果?已更新。只需将一些默认值设置为
ARG
,您就不需要传递显式的docker compose build,它还支持--build ARG作为参数,我明白了。谢谢。可能是@LinPy的副本,但是我认为Adiii的回答更清楚地表明,您需要定义您在Dockerfile中传递的参数。不知道这方面的惯例是什么,等等