Appearance
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
参考
- 【VSCode】远程编码,ssh连接卡在downloading vscode server - NotReferenced - 博客园,手动安装 vscode server,配置 ssh 公钥