Skip to content

制作自己的镜像

简单版本

1. 编写 Dockerfile

Dockerfile
# 基础镜像
FROM node:latest
# 维护者信息
LABEL maintainer="jsopy"
# 设置工作目录
WORKDIR /app
# 复制文件到工作目录注意. 后面的空格
COPY . /app
# 安装依赖
RUN npm config set registry https://registry.npmmirror.com/
RUN npm install -g http-server
# 暴露端口
EXPOSE 8080
# 挂载磁盘
VOLUME /app
# 执行命令
CMD ["http-server", "-p", "8080"]

2. 构建镜像

  • 注意 最后是 空格+ .
shell
docker build -t 你的镜像名称:你的标签名称 -f 你指定的dockerfile名字 .

复杂版本

.dockerignore

  • .dockerignore 文件和 .gitignore 文件类似,用于排除不需要包含在镜像中的文件和目录
bash
*.md
!README.md
node_modules/
[a-c].txt
.git/
.DS_Store
.vscode/
.dockerignore
.eslintignore
.eslintrc
.prettierrc
.prettierignore
  • *.md 就是忽略所有 md 结尾的文件,

  • !README.md 就是其中不包括 README.md

  • node_modules/ 就是忽略 node_modules 下 的所有文件

  • [a-c].txt 就是忽略 a.txt, b.txt, c.txt

  • .git/ 就是忽略 git 仓库

  • .DS_Store 就是忽略 mac 系统下的隐藏文件

  • .vscode/ 就是忽略 vscode 的配置文件

  • .dockerignore 就是忽略 dockerignore 文件

  • .eslintignore 就是忽略 eslint 的配置文件

  • .eslintrc 就是忽略 eslint 的配置文件

  • .prettierrc 就是忽略 prettier 的配置文件

  • .prettierignore 就是忽略 prettier 的配置文件

pm2 版本

1. 先去拉取 Node 基础镜像

  • 我拉取的是 alpine 版本的 node 镜像,因为 alpine 镜像比较小,比较适合用来做基础镜像
bash
docker pull node:22-alpine3.21

创建一个 nest 项目

  • 项目结构
ts

// 写一个nest项目目录
├── .dockerignore
├── 2.dockerfile // 删除src只保留dist版本
├── Dockerfile  // 原始版本全部保留
├── README.md
├── nest-cli.json
├── package.json
├── src
│   ├── app.controller.spec.ts
│   ├── app.controller.ts
│   ├── app.module.spec.ts
│   ├── app.module.ts
│   ├── app.service.spec.ts
│   ├── app.service.ts
│   ├── main.ts
│   └── test.ts
├── test
│   ├── app.e2e-spec.ts
│   └── test.app.module.ts
└── tsconfig.json

编写 Dockerfile

bash


FROM node:alpine3.22

WORKDIR /app

COPY package.json .

RUN npm config set registry https://registry.npmmirror.com/

RUN npm install

COPY . /app

RUN npm run build

RUN npm install pm2 -g

EXPOSE 5000

# CMD ["pm2-runtime", "/app/main.js"] // 无配置文件

CMD ["pm2-runtime","start", "ecosystem.config.js","--env","production" ]

执行打包命令

bash
docker build -t 你的镜像名:版本号 -f 你指定的dockerfile .

非 pm2 版本

1. 先去拉取 Node 基础镜像

  • 我拉取的是 alpine 版本的 node 镜像,因为 alpine 镜像比较小,比较适合用来做基础镜像
bash
docker pull node:22-alpine3.21

创建一个 nest 项目

  • 项目结构
ts

// 写一个nest项目目录
├── .dockerignore
├── 2.dockerfile // 删除src只保留dist版本
├── Dockerfile  // 原始版本全部保留
├── README.md
├── nest-cli.json
├── package.json
├── src
│   ├── app.controller.spec.ts
│   ├── app.controller.ts
│   ├── app.module.spec.ts
│   ├── app.module.ts
│   ├── app.service.spec.ts
│   ├── app.service.ts
│   ├── main.ts
│   └── test.ts
├── test
│   ├── app.e2e-spec.ts
│   └── test.app.module.ts
└── tsconfig.json

编写 Dockerfile

ts

FROM node:22-alpine3.21

WORKDIR /app

COPY package.json .

RUN npm config set registry https://registry.npmmirror.com/

RUN npm install

COPY . /app

RUN npm run build

EXPOSE 5000

CMD [ "node", "./dist/main.js" ]
  • 这种打包以后 900M 左右,因为把 src 下的所有文件都打包进去了,所以体积比较大

编写 2.dockerfile 去掉 src

bash

# build stage
# 通过 FROM 继承镜像的时候,给当前镜像指定一个名字,比如 build-stage。
#-alpine3.14 就是用 alpine 的 linux 的 3.5 版本,用 node 的 最新 版本。
FROM node:22-alpine3.21 AS build-stage
# 指定app目录为工作目录
WORKDIR /app
# 将package.json复制到工作目录
COPY package.json .
# 设置仓库
RUN npm config set registry https://registry.npmmirror.com/
# 安装依赖
RUN npm install
# 将所有文件复制到工作目录
COPY . /app
# 构建项目
RUN npm run build

# production stage
# 通过 FROM 继承镜像的时候,给当前镜像指定一个名字,比如 production-stage。
FROM node:22-alpine3.21 AS production-stage
# 通过 COPY --from-build-stage 从那个镜像内复制 /app/dist 的文件到当前镜像的 /app 下。
COPY --from=build-stage /app/dist /app
COPY --from=build-stage /app/package.json /app/package.json
# 指定工作目录
WORKDIR /app
# 设置仓库地址
RUN npm config set registry https://registry.npmmirror.com/
# 安装依赖
RUN npm install --production
# 暴露端口
EXPOSE 5000
# 启动项目
CMD ["node", "/app/main.js"]
  • 这种打包以后是上面的一半 因为没有 src 目录

执行打包命令

bash
docker build -t 你的镜像名:版本号 -f 你指定的dockerfile .