场景:研发同事需要一个指定版本的npm环境,但是现在使用的是docker部署的jenkins,在不新构建jenkins镜像的前提下,选择挂载方式解决。
1.下载nodejs 16版本的nodesource-nodejs.repo仓库脚本
cd /etc/yum.repos.d/ curl -sL https://rpm.nodesource.com/setup_16.x | bash -
如果执行下载nodesource-nodejs.repo没有反应
可尝试增加hosts解析后再进行下载
echo "104.22.5.26 rpm.nodesource.com" >>/etc/hosts
2.安装nodejs
yum install nodejs -y
node -v npm -v
3.修改docker启动命令将node安装目录和二进制文件挂载到jenkins
docker run -d \ -v /data/jenkins_home:/var/jenkins_home \ -p 8080:8080 \ -p 50000:50000 \ -v $(which docker):/usr/bin/docker \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/local/node16.20:/usr/local/node16.20 \ -v /usr/bin/node:/usr/bin/node \ --name jenkins \ --restart=on-failure \ -u 0 \ --entrypoint "/bin/bash" \ jenkins/jenkins \ -c "rm -rf /usr/bin/npm && ln -s /usr/local/node16.20/bin/npm /usr/bin/npm && exec jenkins.sh"
进入容器验证node环境
node -v npm -v
命令说明:
docker run -d \
-v /data/jenkins_home:/var/jenkins_home \将宿主机上的
/data/jenkins_home
目录挂载到容器内的/var/jenkins_home
目录,这样容器内的 Jenkins 数据会持久化到宿主机上。
-p 8080:8080 \
-p 50000:50000 \
-v $(which docker):/usr/bin/docker \宿主机上的
docker
二进制文件挂载到容器内的/usr/bin/docker
容器可以使用宿主机的 Docker 客户端
-v /var/run/docker.sock:/var/run/docker.sock \挂载宿主机的 Docker socket 到容器内,允许容器内的进程直接与 Docker 守护进程通信
-v /usr/local/node16.20:/usr/local/node16.20 \
挂载宿主机上的
/usr/local/node16.20
目录到容器内的同名目录
-v /usr/bin/node:/usr/bin/node \挂载宿主机上的
/usr/bin/node
链接到容器内的/usr/bin/node,多版本可以自定义
--name jenkins \
--restart=on-failure \
-u 0 \root 用户运行容器内的进程。
--entrypoint "/bin/bash" \使用
/bin/bash
作为新的入口,容器启动时,它会首先运行/bin/bash
而不是默认的jenkins.sh
。jenkins/jenkins \
镜像名称
-c "rm -rf /usr/bin/npm && ln -s /usr/local/node16.20/bin/npm /usr/bin/npm && exec jenkins.sh"容器内执行shell命令:rm -rf /usr/bin/npm && ln -s /usr/local/node16.20/bin/npm /usr/bin/npm&& exec jenkins.sh