Webpack 应用程序在 Docker 中构建之前需要环境变量。

3

我是新手,可能会错过一些显而易见的东西...

我的应用程序分为Web客户端和后端服务器。通过Dockerfile创建一个后端映像非常容易:

  1. COPY 源码
  2. RUN npm install, npm run build
  3. CMD npm run start

已构建的后端应用程序将在运行时访问环境变量。

对于Web客户端来说,情况并不简单,因为Webpack需要在构建应用程序之前获取环境变量。就我所知,这只留给我两个选择:

  1. 要求用户从应用程序源代码构建自己的镜像
  2. 通过在CMD中运行npm run build,在container run上构建Web客户端

目前我正在使用#2,但两个选项都似乎不正确。什么是最佳解决方案?

FROM node:latest
COPY ./server /app/server
COPY ./web /app/web
WORKDIR /app/web
CMD ["sh", "-c", "npm install && npm run build && cd ../server && npm install && npm run build && npm run start"]

你可以指导他们在新的Dockerfile中使用FROMENV,并在原始容器中使用ONBUILD来进行构建。 - ferrix
你能否发布一下你已经编写的用于 Web 客户端的 Dockerfile,这样我们就可以看到哪些变量需要被使用了? - Jack Gore
另一个选项是通过卷传递文件并编写入口脚本来解析该文件,设置变量并可能使用现有的构建。如果容器重新启动,则会减少响应时间。此外,是否可以在构建过程中完成大部分构建,并将需要环境变量的部分减少到较小的操作?例如,使用来自 env 的值替换包含默认值的 config.js。 - ferrix
1个回答

2
首先,建议为后端服务器和Web客户端分别创建自己的Dockerfile/image。然后,可以使用类似docker-compose的工具轻松运行它们。
要为Web Dockerfile提供环境变量,您需要使用构建参数。在构建Docker镜像时,Docker构建参数可用。您可以通过在Dockerfile中指定ARG键或通过传递--build-arg标志到docker build来使用这些参数。
以下是基于您提供的内容的Web客户端的示例Dockerfile:
FROM node:latest

ARG NODE_ENV=dev

COPY ./web /app/web
WORKDIR /app/web

RUN npm install \
    && npm run build

CMD ["npm", "run", "start"]

以下的Dockerfile使用ARG指令创建一个默认值为dev的变量。
当运行docker build时,可以覆盖NODE_ENV的值。
用法如下:
docker build -t <myimage> --build-arg NODE_ENV=production .

无论您是否覆盖它,NODE_ENV 在 webpack 构建之前都将可用。这使您可以构建单个映像并将其分发给许多人,而无需他们构建 Web 客户端。
希望这可以帮助您。

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