在查看了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;"]
我有几个问题,如下,
- 在上面的
Dockerfile
中,当我在docker-compose.yml
文件中针对production
时,它会在Dockerfile中运行开发阶段吗? - 如果是这样,我怎么能避免它被运行?因为开发有不同的
yarn install
命令,它也复制src文件夹,这将是多余的production
阶段。 - 我应该努力有一个单一的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
你可以在这里阅读更多。