在不支持高版本 Node.js 的环境运行 Node
笔者在服务端部署项目时,由于使用的服务端系统较旧(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
| sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast sudo yum -y install docker-ce
sudo service docker start
注意:其他注意事项在下面的注释中
|
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
| sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get -y update sudo apt-get -y install docker-ce
注意:其他注意事项在下面的注释中
|
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 docker save -o node-18.tar node:18
|
从离线文件加载镜像
(适用于无可用镜像源的情况或离线机)
1
| docker load -i /path/to/image/node-18.tar
|
列出目前所有镜像
使用 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)
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 \ -v $(pwd)/error.log:/error.log \ -p 80:80 \ <image-name>
|
为解决容器内无权限创建文件以及无 su root 可用问题,通过映射主机文件到容器内,规避需要权限的问题。