Docker中的Webpack应用程序需要环境变量才能构建

时间:2019-02-20 22:44:15

标签: docker webpack environment-variables

Docker的新手,所以也许我缺少明显的东西...

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

  1. COPY来源
  2. RUN npm installnpm run build
  3. CMD npm run start

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

使用Web客户端并不是那么简单,因为webpack需要在构建应用程序之前 具有环境变量。据我所知,这只剩下两个选择:

  1. 要求用户从应用程序源构建自己的图像
  2. 通过在container run中运行npm run buildCMD上构建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"]

1 个答案:

答案 0 :(得分:1)

首先,对于后端服务器和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的变量。

运行NODE_ENV时可以覆盖docker build的值。

像这样:

docker build -t <myimage> --build-arg NODE_ENV=production .

无论是否覆盖它,NODE_ENV都可以在构建Webpack之前使用。这样一来,您可以构建单个图像,然后将其分发给许多人,而无需构建Web客户端。

希望这对您有所帮助。