【问题标题】:Webpack app in docker needs environment variables before it can be builtdocker中的Webpack应用需要环境变量才能构建
【发布时间】:2019-02-20 22:44:15
【问题描述】:

Docker 新手,所以我可能遗漏了一些明显的东西......

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

  1. COPY
  2. RUNnpm installnpm run build
  3. CMDnpm run start

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

使用 web 客户端就没有那么简单了,因为 webpack 需要在构建应用程序之前 拥有环境变量。据我所知,这让我只有两个选择:

  1. 要求用户从应用源构建自己的镜像
  2. 通过在CMD 中运行npm run buildcontainer 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 来进行构建。
  • 您能否发布您目前为 Web 客户端提供的 Dockerfile,以便我们查看需要在何处使用变量?
  • @JackGore 这些变量与 Dockerfile 本身并不真正相关,但 webpack 配置需要它们来设置 process.env。只有 NODE_ENV 直接在 webpack 配置中使用,其余的 API URL 或应用名称也设置为 process.env 并稍后在应用本身中使用。
  • @ferrix 我想​​我可以,但我试图阻止最终用户需要构建自己的图像并坚持只使用轻型配置运行我的图像,但似乎这没什么大不了的这就是 Docker 通常处理事情的方式。
  • @JackGore 我更新了我的帖子。目前客户端和服务器都在同一个图像中,刚刚用于测试。专注于 Web 部件,因为我已经知道为服务器处理此问题的正确方法。如您所见,CMD 行非常可怕,当服务器使用自己的正确RUN 语句和简单的CMD ["npm", "run", "start"] 放入自己的映像时,它只会稍微好一点。目前在docker container run期间提供所有环境变量。

标签: docker webpack environment-variables


【解决方案1】:

首先,后端服务器和 Web 客户端都拥有自己的 Dockerfile/图像是个好主意。然后使用docker-compose 之类的东西很容易将它们一起运行。

您希望向 Web Dockerfile 提供环境变量的方式是使用构建参数。构建 Docker 映像时可以使用 Docker 构建参数。您可以通过在 Dockerfile 中指定 ARG 键或将 --build-arg 标志传递给 docker build 来使用它们。

这里是一个示例Dockerfile,基于您提供的内容,适用于您的 Web 客户端:

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 客户端。

希望这对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2017-01-30
    相关资源
    最近更新 更多