笔者在服务端部署项目时,由于使用的服务端系统较旧(CentOS 7.9),导致安装运行 Node.js 18 时出现缺少依赖报错。因为 Node.js 18 需要 GLIBC 版本至少为 2.28,而 CentOS 7.9 默认提供的 GLIBC 版本是 2.17。然而网上的解决办法显示升级依赖比较复杂,而且风险高,容易导致系统无法正常运行。
因此,根据网上的教程决定换用 Docker 容器运行 Node,进而对项目进行打包。

1 安装 Docker CE

以下安装方法摘自阿里云开发者社区

使用官方安装脚本自动安装 (仅适用于公网环境)

1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

CentOS 7 (使用yum进行安装)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

注意:其他注意事项在下面的注释中
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
# 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。
# yum list docker-ce-selinux- --showduplicates | sort -r
# sudo yum -y install docker-ce-selinux-[VERSION]

# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2中的命令
# 经典网络:
# sudo yum-config-manager --add-repo http://mirrors.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
# VPC网络:
# sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo

Ubuntu 14.04 16.04 (使用apt-get进行安装)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

注意:其他注意事项在下面的注释中
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2、Step 3中的命令
# 经典网络:
# curl -fsSL http://mirrors.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyuncs.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# VPC网络:
# curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

2 验证安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@iZbp12adskpuoxodbkqzjfZ:$ docker version
Client:
Version: 17.03.0-ce
API version: 1.26
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 07:52:04 2017
OS/Arch: linux/amd64

Server:
Version: 17.03.0-ce
API version: 1.26 (minimum version 1.12)
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 07:52:04 2017
OS/Arch: linux/amd64
Experimental: false

3 常用 Docker 指令

启动 Docker 服务

1
sudo service docker start

镜像相关

手动拉取指定镜像

只进行下载,不运行任何容器。同时可以将本地镜像保存为文件,可以手动移至离线机进行部署。

1
2
docker pull node:18 # 下载 Node.js 18 镜像
docker save -o node-18.tar node:18 # 将 Node.js 18 镜像保存为文件

从离线文件加载镜像

(适用于无可用镜像源的情况或离线机)

1
docker load -i /path/to/image/node-18.tar

列出目前所有镜像

1
docker images

使用 Node 镜像 运行/构建 工程

1
docker run --rm -v $(pwd):/app node:18 bash -c "cd /app && npm install && npm build"

使用 Docker 运行 Node.js 18 镜像,执行以下操作:

  • --rm:容器停止后自动删除容器。(由于这里只执行打包,不包含持续运行)
  • -v $(pwd):/app:将当前目录挂载到容器内的 /app 目录。
  • node:18:指定使用 Node.js 18 的官方 Docker 镜像。
  • bash -c "cd /app && npm install && npx hexo generate":在容器内执行命令。
    至此,实现了在不安装 Node.js 18 环境的情况下,完成项目打包。

windows 的区别 LF / CRLF

含义:(Carriage Return/Line Feed)

1
#13 59.31 /project-name/docker/build.sh: line 19: $'\r': command not found

git 拉取代码时,在 Windows 系统下文件会以 CRLF 作为换行符,而 Unix 系统会以 LF 作为换行符。CRLF 就是 \r\n,而 LF 是 \n

這就是為什麼有些檔案從unix系統拿去windows上面看,會變成全部都在同一行,因為只有LF 他不知道是換行,windows只吃CRLF,除了一些比較聰明的文字編輯器會分的出來。
不過其實,CRLF才是真正的打字機運作方式,你可以想像:打字機打到最右邊,要先return到最左邊之後,再往下一行,所以是CRLF

如果想要清空 answer.txt 裡面所有的 \r 的話,可以使用以下指令:tr -d '\r' answer.txt

构建目标文件夹

1
docker build --progress=plain -t <project-name> <project-path>

运行镜像并进入其终端

1
docker run --rm -it <image-name> /bin/sh

运行镜像并暴露指定端口

1
2
3
4
5
docker run --rm -it \
-v $(pwd)/access.log:/access.log \ # 将当前目录的 access.log 映射到容器内根目录下
-v $(pwd)/error.log:/error.log \
-p 80:80 \
<image-name>

为解决容器内无权限创建文件以及无 su root 可用问题,通过映射主机文件到容器内,规避需要权限的问题。