dify-web的Dockerfile分析

一.dify-web的Dockerfile文件

dify-web的Dockerfile文件如下所示:

# base image
FROM node:20.11-alpine3.19 AS base
LABEL maintainer="takatost@gmail.com"

# if you located in China, you can use aliyun mirror to speed up
# RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

RUN apk add --no-cache tzdata


# install packages
FROM base as packages

WORKDIR /app/web

COPY package.json .
COPY yarn.lock .

# if you located in China, you can use taobao registry to speed up
# RUN yarn install --frozen-lockfile --registry https://registry.npmmirror.com/

RUN yarn install --frozen-lockfile

# build resources
FROM base as builder
WORKDIR /app/web
COPY --from=packages /app/web/ .
COPY . .

RUN yarn build


# production stage
FROM base as production

ENV NODE_ENV production
ENV EDITION SELF_HOSTED
ENV DEPLOY_ENV PRODUCTION
ENV CONSOLE_API_URL http://127.0.0.1:5001
ENV APP_API_URL http://127.0.0.1:5001
ENV PORT 3000

# set timezone
ENV TZ UTC
RUN ln -s /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone

# global runtime packages
RUN yarn global add pm2 \
    && yarn cache clean

WORKDIR /app/web
COPY --from=builder /app/web/public ./public
COPY --from=builder /app/web/.next/standalone ./
COPY --from=builder /app/web/.next/static ./.next/static


COPY docker/pm2.json ./pm2.json
COPY docker/entrypoint.sh ./entrypoint.sh

ARG COMMIT_SHA
ENV COMMIT_SHA ${COMMIT_SHA}

EXPOSE 3000
ENTRYPOINT ["/bin/sh", "./entrypoint.sh"]

二.Dockerfile文件分析

1.基础镜像设置

FROM node:20.11-alpine3.19 AS base
LABEL maintainer="takatost@gmail.com"
  • FROM node:20.11-alpine3.19 AS base:此行指定后续指令的基础镜像。这里使用的是基于 Alpine Linux 3.19 的 Node.js 镜像(node:20.11),并命名此阶段为 base

  • LABEL maintainer=“takatost@gmail.com”:为镜像添加标签,指定维护者的邮箱。

2.配置中国镜像源(被注释)

# if you located in China, you can use aliyun mirror to speed up
# RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
  • 这部分被注释了,如果在中国,可以通过修改 apk 的源到阿里云来加速包的下载。

3.安装时区数据

RUN apk add --no-cache tzdata
  • RUN apk add --no-cache tzdata:安装 tzdata 包,这允许容器使用正确的时区数据。

4.安装依赖包阶段

FROM base as packages

WORKDIR /app/web

COPY package.json .
COPY yarn.lock .

# if you located in China, you can use taobao registry to speed up
# RUN yarn install --frozen-lockfile --registry https://registry.npmmirror.com/

RUN yarn install --frozen-lockfile
  • FROM base as packages:从 base 镜像开始新的阶段,命名为 packages

  • WORKDIR /app/web:设置工作目录为 /app/web

  • COPY package.json .COPY yarn.lock .:将 package.jsonyarn.lock 文件复制到工作目录。

  • RUN yarn install --frozen-lockfile:使用 Yarn 安装依赖项,锁定版本。

5.构建资源阶段

FROM base as builder
WORKDIR /app/web
COPY --from=packages /app/web/ .
COPY . .

RUN yarn build
  • FROM base as builder:从 base 镜像开始新的阶段,命名为 builder

  • COPY --from=packages /app/web/ .:从 packages 阶段复制所有内容到工作目录。

  • COPY . .:复制当前目录下所有文件到工作目录。

  • RUN yarn build:执行构建命令。

6.生产阶段设置

FROM base as production

ENV NODE_ENV production
...
  • FROM base as production:从 base 镜像开始新的阶段,命名为 production

  • ENV NODE_ENV production:设置环境变量 NODE_ENVproduction

  • ENV TZ UTC:设置时区为 UTC。

  • RUN yarn global add pm2 \ && yarn cache clean:全局安装 PM2(Node.js 的进程管理器)并清理 Yarn 缓存。

7.最终命令和端口设置

EXPOSE 3000
ENTRYPOINT ["/bin/sh", "./entrypoint.sh"]
  • EXPOSE 3000:暴露端口 3000。

  • ENTRYPOINT [“/bin/sh”, “./entrypoint.sh”]:设置容器启动时执行的入口点脚本。

该Dockerfile 不仅构建了一个 Node.js 应用的容器环境,还考虑了环境优化和多阶段构建来减小最终镜像的大小。

三.不同构建阶段详解

在 Dockerfile 中使用多阶段构建可以帮助优化最终镜像的大小和安全性,通过构建过程中的不同阶段来管理不同的任务和资源。下面是您的 Dockerfile 中提到的各个阶段(basepackagesbuilderproduction)之间的关系和作用:

1. Base 阶段

目的:设置一个共通的基础环境,以供后续的所有阶段使用。这个阶段安装了 Node.js 环境和基础的时区数据(通过安装 tzdata 包)。

优点:所有后续阶段都从这个基础环境继承,这样可以避免重复安装相同的基础软件,减少了构建时间和镜像大小。

2. Packages 阶段

目的:在独立的阶段中安装应用的依赖。这个阶段利用 base 阶段的环境,复制 package.jsonyarn.lock 文件,并执行 yarn install 命令来安装依赖。

优点:将依赖安装在独立的阶段中可以缓存依赖,除非 package.jsonyarn.lock 发生变化,否则 Docker 在构建时可以重用缓存的依赖层,这大大加速了构建过程。

3. Builder 阶段

目的:执行应用的构建过程。这个阶段同样基于 base 阶段,并从 packages 阶段复制安装好的依赖及应用代码,然后运行 yarn build 命令来构建应用。

优点:由于此阶段专注于应用的构建,因此可以独立管理构建资源和过程,构建完成后,只需要将构建产物(例如编译后的文件)转移到最终的生产镜像中。

4. Production 阶段

目的:设置用于运行应用的生产环境。这一阶段也是基于 base 阶段,设置了多个环境变量,并从 builder 阶段复制构建产物。此外,安装了 PM2 作为进程管理器来管理 Node.js 应用,并设置了容器的启动入口点。

优点:这个阶段产生了最终的生产镜像,仅包含运行应用所必需的文件和设置,没有包括用于构建应用的依赖和工具,从而确保了生产环境的精简和安全。

5.阶段之间的关系

  • 继承性:每个阶段都从 base 阶段继承,保证了环境的一致性。

  • 依赖性builder 阶段依赖 packages 阶段提供的依赖,production 阶段依赖 builder 阶段提供的构建产物。

  • 优化性:每个阶段聚焦于特定任务,优化了构建过程和最终镜像的大小。

通过这种方式,Dockerfile 的多阶段构建不仅提高了构建的效率,还确保了镜像的整洁和安全,使得维护和部署都更为便捷和可靠。

相关推荐

  1. vuediff算法

    2024-07-11 15:16:02       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 15:16:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 15:16:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 15:16:02       58 阅读
  4. Python语言-面向对象

    2024-07-11 15:16:02       69 阅读

热门阅读

  1. slf4j日志框架和logback详解

    2024-07-11 15:16:02       21 阅读
  2. Redis的配置和优化

    2024-07-11 15:16:02       21 阅读
  3. springboot 抽出多个接口中都有相同的代码的方法

    2024-07-11 15:16:02       22 阅读
  4. OpenJudge | 最高的分数

    2024-07-11 15:16:02       20 阅读
  5. springmvc 如何对接接口

    2024-07-11 15:16:02       22 阅读
  6. VUE2用elementUI实现父组件中校验子组件中的表单

    2024-07-11 15:16:02       22 阅读
  7. 解释一下DecorView和Window之间的交互。

    2024-07-11 15:16:02       24 阅读
  8. 【AI原理解析】-目标检测概述

    2024-07-11 15:16:02       19 阅读