Skip to content

Node.js 环境

why

  • 测试:快速生成 Node.js 环境,执行 JS/TS 测试脚本
  • 运行/构建:指定 Node.js 版本,运行/构建 JS/TS 前后端服务
  • 开发:创建可复用 Node.js 容器,作为 JS/TS 开发环境

how

○ 测试

  • 挂载脚本目录
  • 运行 Node.js 镜像,运行挂载目录中的脚本
sh
docker run -it --rm \
    --mount type=bind,source=/home/aubur/app,target=/app \
    swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/node:lts-alpine \
    node /app/index.js

○ 运行/构建

  • 挂载 pnpm 全局存储目录、项目目录(含 node_modules)
  • 构建镜像:安装依赖,运行/构建项目
  • 运行镜像

○ 开发

  • 挂载 pnpm 全局存储目录、项目目录(含 node_modules)、启动脚本目录,/root/.vscode-server 目录
  • 构建镜像
    • 基于 node + alpine
    • 暴露 ssh 的 22 端口
    • 更新 alpine 系统软件包,ssh 相关 + vscode 远程连接相关
    • 生成 ssh 密钥
    • 更新 ssh 配置
    • 执行启动脚本:添加授权的 ssh 公钥(使本地无须密码连接容器),运行 sshd,不退出脚本
  • 运行容器,vscode 远程连接容器
Dockerfile
# 镜像来自渡渡鸟镜像同步站
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/node:lts-alpine

# 暴露 ssh 端口
EXPOSE 22

# 软件源来自阿里云
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    && apk update \
    && apk add gcompat libstdc++ curl bash git openssh

# 生成 ssh 密钥
RUN ssh-keygen -A

# vscode ssh 连接,依赖 AllowTcpForwarding
# 🚨注意:/etc/ssh/sshd_config 和 /etc/ssh/ssh_config 是 2 个不同的文件
RUN sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config \
    && sed -i 's/#PubkeyAuthentication.*/PubkeyAuthentication yes/g' /etc/ssh/sshd_config \
    && sed -i 's/#PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config \
    && sed -i 's/#PermitTunnel.*/PermitTunnel yes/g' /etc/ssh/sshd_config \
    && sed -i 's/AllowTcpForwarding.*/AllowTcpForwarding yes/g' /etc/ssh/sshd_config

# 配置 ssh 本地公钥到容器中(运行时配置,方便动态修改)
# 🚨注意:~/.ssh/authorized_keys 中 ~ home 目录,对应容器中的 /root
# 脚本中最后一行命令实现脚本不结束
# 🚨init.sh 脚本也可直接从主机挂载
RUN echo 'mkdir -p /root/.ssh' > /root/init.sh \
    && echo 'cat /work/ssh/authorized_keys > /root/.ssh/authorized_keys' >> /root/init.sh \
    && echo '/usr/sbin/sshd' >> /root/init.sh \
    && echo 'tail -f /dev/null' >> /root/init.sh
    
# 启动 ssh 服务
CMD ["sh", "/root/init.sh"]
sh
# 构建镜像
docker build -t aubur/node-lts-alpine .

# 准备挂载目录
mkdir -p /home/aubur/work/docker/ssh
cat ~/.ssh/id_ed25519.pub > /home/aubur/work/docker/ssh/authorized_keys

# 静默运行,启动 ssh
docker run -d --rm --mount type=bind,source=/home/aubur/work/docker,target=/work -p 4022:22 aubur/node-lts-alpine

# 静默运行后,可通过容器 id 临时进入交互模式
docker ps -s
docker exec -it $containerId /bin/sh

# 交互运行,启动终端,用于调试容器
docker run -it --rm --mount type=bind,source=/home/aubur/work/docker,target=/work -p 4022:22 aubur/node-lts-alpine /bin/sh

参考

访问量 PV:Blocked用户数 UV:Blocked