如何为react js的所有环境维护一个单一的dockerfile ?



在查看了react与多阶段构建的大量实现后,我编写了以下Dockerfile。我试图实现有一个单一的Dockerfile为所有的环境。当前是dev + prod,但将来是dev, qa, automation, staging, pt, preprod, prod。

# Create a base image with dependencies
FROM node:16.15.0-alpine3.14 AS base
ENV NPM_CONFIG_LOGLEVEL warn
RUN addgroup app && adduser -S -G app app
USER app
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json yarn.lock ./

# Create a development environment
FROM base AS development
ENV NODE_ENV development
RUN yarn install --frozen-lockfile
COPY . .
EXPOSE 3000
CMD [ "yarn", "start" ]

# Generate build
FROM base AS builder
ENV NODE_ENV production
RUN yarn install --production
COPY . .
RUN yarn build

# Create a production image
FROM nginx:1.21.6-alpine as production
ENV NODE_ENV production
COPY --from=builder /app/build /usr/share/nginx/htm
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

我有几个问题,如下,

  1. 在上面的Dockerfile中,当我在docker-compose.yml文件中针对production时,它会在Dockerfile中运行开发阶段吗?
  2. 如果是这样,我怎么能避免它被运行?因为开发有不同的yarn install命令,它也复制src文件夹,这将是多余的production阶段。
  3. 我应该努力有一个单一的Dockerfile和多个docker-compose.yml文件,如docker-compose.dev.yml,docker-compose.prod.yml等?

你可以有一个基本文件docker-compose。它将包含公共服务。然后可以创建docker-compose-prod。Yml, docker- composition -dev。等,其中包含特定于环境的覆盖。执行docker compose命令时,可以指定多个文件,配置将合并为一个文件执行。

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

你可以在这里阅读更多。

最新更新