npm私服verdaccio离线环境搭建(基于docker,内网成功)解决node-sass离线安装问题 解决docker 挂载无效的问题
序:去年搭建npm私服败给了内网环境。今年基于docker(没有docker 直接在服务器上安装 node 和 verdaccio pm2 也成)重新立flag。坎坎坷坷总算搭建成功。(本人耗时1周)实际上如果路通的话 半个小时就搞定了。今天总结一下。关于思路如果你想搭建非docker环境的,可以看一下我另一篇文章关于npm 私服搭建的文章,参考思路。失败是成功之母。感谢去年1周积累的...
序:去年搭建npm私服败给了内网环境。今年基于docker(没有docker 直接在服务器上安装 node 和 verdaccio pm2 也成)重新立flag。坎坎坷坷总算搭建成功。(本人耗时1周)
实际上如果路通的话 半个小时就搞定了。今天总结一下。
关于思路如果你想搭建非docker环境的,可以看一下我另一篇文章关于npm 私服搭建的文章,参考思路。
失败是成功之母。感谢去年1周积累的经验。
先说一下思路大家仔细理解思路,思路跟不上 ,往下看也白玩。
1、在online环境搭建verdaccio(本机,http://localhost:4873)
2、在offline环境搭建verdaccio(服务器,http://100.54.34.6:4873)
3、切换包源 到 http://localhost:4873
4、在有网环境项目根目录下 npm install (将包缓存到本机)
5、将本地的包拷贝到服务器的verdaccio 包缓存目录下。
6、在离线环境设置npm源后即可npm install。
环境搭建(有网环境):window10
1、docker for windows (先安装docker for windows)
官网地址:https://www.docker.com/products/docker-desktop
2、阿里云镜像加速[可选]
考虑到一些镜像在国内会pull不下来所以,大家可以考虑启用阿里云镜像加速。这里我就不造轮子了。大家可以参考如下资料。
实在不行求助度娘,镜像加速好解决。
参考资料:https://blog.csdn.net/K_520_W/article/details/83240921
3、使用命令拉取verdaccio镜像
docker pull verdaccio/verdaccio
4、先把这个镜像run 起来,拷贝一份默认的配置文件。(先不挂载 别急)
docker run -itd --name verdaccio -p 4873:4873 verdaccio/verdaccio
(如果你的端口被占用,是起不来的,可以通过 docker ps 命令 来查看 正在运行的镜像)
就应该看到如下界面(我这个是发过包的所以能看到一个包。后面会讲解发包。(你们看到的应该是没有包的))
起来之后,先在 找一个路径创建文件夹
我选择的是 D:\verdaccio\ (这个路径后面会挂载使用)
现在运行如下命令:从容器中把默认配置文件拷贝出来。
//切换目录至D:\verdaccio下
docker cp verdaccio:/verdaccio/conf ./
运行后,你会发现 文件夹下多了一个 conf 文件夹
这个文件中有一个 config.yaml 文件(这个就是verdaccio的配置文件)
手动编辑这个文件先修改一下上游包源改成淘宝源。
#
# This is the config file used for the docker images.
# It allows all users to do anything, so don't use it on production systems.
#
# Do not configure host and port under `listen` in this file
# as it will be ignored when using docker.
# see https://github.com/verdaccio/verdaccio/blob/master/wiki/docker.md#docker-and-custom-port-configuration
#
# Look here for more config file examples:
# https://github.com/verdaccio/verdaccio/tree/master/conf
#
# path to a directory with all packages
# 包缓存路径
storage: /verdaccio/storage/data
# 登录帐号存储文件
auth:
htpasswd:
file: /verdaccio/storage/htpasswd
# Maximum amount of users allowed to register, defaults to "+inf".
# You can set this to -1 to disable registration.
#max_users: 1000
security:
api:
jwt:
sign:
expiresIn: 60d
notBefore: 1
web:
sign:
expiresIn: 7d
# a list of other known repositories we can talk to
# 上游包源设置
uplinks:
npmjs:
url: https://registry.npm.taobao.org/
packages:
'@jota/*':
access: $all
publish: $all
unpublish: $all
'@*/*':
# scoped packages
access: $all
publish: $all
unpublish: $all
proxy: npmjs
'**':
# allow all users (including non-authenticated users) to read and
# publish all packages
#
# you can specify usernames/groupnames (depending on your auth plugin)
# and three keywords: "$all", "$anonymous", "$authenticated"
access: $all
# allow all known users to publish packages
# (anyone can register by default, remember?)
publish: $all
unpublish: $all
# if package is not available locally, proxy requests to 'npmjs' registry
proxy: npmjs
# To use `npm audit` uncomment the following section
middlewares:
audit:
enabled: true
# log settings
logs:
- {type: stdout, format: pretty, level: trace}
#- {type: file, path: verdaccio.log, level: info}
# 离线发布并没有卵用
publish:
allow_offline: true
这个编辑器不带颜色凑合看(有修改的地方都有中文注释)
5、配置文件编辑完毕,删除刚刚的镜像(因为这次需要挂载路径)
//先将容器停下
docker stop verdaccio
//删除容器
docker rm verdaccio
//还是在 D:\verdaccio 这个目录下执行
docker run -itd --name verdaccio -p 4873:4873 -v conf:/verdaccio/conf:rw -v storage:/verdaccio/storage:rw -v plugins:/verdaccio/plugins verdaccio/verdaccio
ps:(这里有个小坑,当 storage 下 文件过多时,挂载会失败,不知道是不是docker的bug。
解决办法就是 将storage 中的文件移走,run 起来之后 在 剪切回去,本教程中不存在此问题,因为之前根本没这个文件夹)我在这儿被坑了好几次,百度了好久都没有解决方案(都说的是一些写入权限的原因,如果你遇到权限问题可以百度),相信我你一定会遇到这个坑的)
这时你的 D:\verdaccio 下 有 如下 三个文件夹,其中 plugins storage 是自动被创建出来的。
6、打开http://localhost:4873 能看到页面即启动成功。
7、设置本地 npm 源为 本机私服
npm config set registry http://localhost:4873
这一步不重要只是一个建议:如果你有频繁切换 源的需求 建议使用 nrm (一个 npm 包源管理工具)
//安装
npm i nrm -g
// 添加一个源
nrm add local http://localhost:4873
//切换源
nrm use local
//列源目录
nrm ls
//删除源
nrm del <name>
8、在项目目录 npm install (这样包就被缓存到D:\verdaccio 下了)
9、别急创建一个用户用于发包
npm adduser
//第一步输入用户名
admin
//第二步输入密码
123456
//第三步输入邮箱
795666xxx@qq.com
10、测试一下 登录
npm login
//输入用户名
//输入密码
//输入邮箱
会提示 logged ...
//登录成功
11、接下来 把D:\verdaccio 打成个 verdaccio.zip 压缩包
12、把镜像导出 这里我用的是 docker save 命令
// 压缩包名 容器名
docker save -o verdaccio.tar verdaccio
截止到以上步骤 内网环境暂时告一段落。
环境搭建(内网环境 offline):centos7
1、内网环境的服务器首先需要安装docker for linux
这个我也不造轮子,参考资料:
https://www.cnblogs.com/luoSteel/p/10038954.html
2、登录到内网服务器后,将之前准备的包先解压开
# 切换到/跟目录
cd /
# 创建一个文件夹
mkdir app
# 进去
cd app
# 然后将 verdaccio.zip 和 verdaccio.tar 都放到这儿。(我这是u盘拷贝到内网台式机上,在通过ssh工具传到这台服务器上的)
# 解压 verdaccio.zip
unzip -o verdaccio.zip
# 解压好后 进入 verdaccio 目录
cd verdaccio
# 因为上面说了 docker 挂载有坑 (经过尝试 linux也有 这问题)所以先把 storage 换个目录
mkdir storage_temp
# 进入 storage 目录
cd storage
mv * ../storage_temp
# 删除 storage 目录
cd ../
rm -rf storage
3、导入 docker 镜像
# 切换目录
cd /app
# 导入基础镜像
docker load < verdaccio.tar
4、使用 docker images 查看镜像id
5、运行镜像(挂载目录)
docker run -itd --name verdaccio -p 4873:4873 -v /app/verdaccio/conf:/verdaccio/conf:rw -v /app/verdaccio/storage:/verdaccio/storage:rw -v /app/verdaccio/plugins:/verdaccio/plugins 972bc1f5cf77
6、将刚刚挪走的包,挪回到 storage 目录
cd /app/verdaccio/storage_temp
mv * ../storage
cd ..
包挪移完毕,可以使用了。
7、内网环境访问 http://100.54.34.6:4873
发现已经可以访问到 verdaccio 页面了。
8、内网机器 设置 包源
npm config set registry http://100.54.34.6:4873
9、内网windows机器,项目目录,npm install
接下来可怕的一幕发生了。
# 内网环境安装 node-sass 失败
Cannot download "https://github.com/sass/node-sass/releases/download.../win32-x64-57_binding.node"
10、解决内网环境 node-sass安装失败的问题
查看 node-sass 版本 为 4.13.1
访问 git node-sass ,在 releases 中找到报错对应的 ***_binding.node
https://github.com/sass/node-sass/releases
下载下来 win32-x64-57_binding.node
这样还不够,因为大家安装的时候 不能让每个人去下载
11、搭建内网 node-sass bindingServer(基于nginx)
注意到上图了吗 nginx 根目录设置为 html 我的版本是 v4.13.1 所以创建了一个 v4.13.1的文件夹来存放.node 文件
这里就粘贴一下 nginx config (nginx-verdaccio 直接看附件吧)
server{
listen 80;
server_name localhost;
location /{
root /home/html;
index index.html;
}
location = /50px.html{
root /usr/share/nginx/html;
}
}
nginx 部署难度不高,当然我部署的nginx 也是基于docker 的。在附一个启动命令
docker run -itd --name nginx-verdaccio -p 9500:80 -v /app/nginx-verdaccio/conf.d:/etc/nginx/conf.d -v /app/nginx-verdaccio/html:/home/html f3a29b88535b
12、设置 SASS_BINARY_SITE
# 内网环境部署的nginx
npm set SASS_BINARY_SITE http://100.54.34.6:9500
13、内网windows 开发机,npm install 本次顺利通过。
私包发布
经过尝试 在内网环境 直接 npm login 后 npm publish 依然失败。(所以回到外网环境发布包,成功之后在复制到内网即可)
1、创建一个包,外网环境 在D:\test-package文件夹下
npm init -y
2、新建一个 index.js 内容为
console.log('hello world from test-package.')
3、执行发布命令即可成功
npm publish
4、进入外网机 verdaccio 挂载目录
已发布的包在这:D:\verdaccio\storage\test-package
可以把 test-package 这个文件夹 拷贝到 内网 verdaccio 的对应 挂载目录中,完成发包(先别急着拷贝,还有个地方要改一下)
5、查看 D:\verdaccio\storage\data\.verdaccio-db.json
这个json文件注意内容
{"list":["test-package"],"secret":"0459b024a235e35122c6d2194639d5481f866d37a904650527e5009bf1a53c0e"}
list 中 有刚刚发布的包名。
把test-package 文件夹拷贝到内网目录的同时,要修改,内网 。verdaccio-db.json 这个文件
把新包名 加到 list :["新包名"] 中
ps:(吐槽一下 verdaccio的配置项 D:\verdaccio\conf\config.yaml)
# 离线发布并没有卵用
publish:
allow_offline: true
这个属性压根就不好使,也可能是我没研究透。时间紧任务重,就到这吧。(Orz)
2020-04-08 11:45:52 Power by datree
----------------------------------------------------------------
6、私包内网环境发布失败,是容器写入权限问题(Orz)
下午继续研究内网私包发布问题,发现 npm publish 500
docker logs -f verdaccio
查看日志 发现果然是权限问题。
有以下几种方式解决挂载的目录没有权限的问题:
1.在运行容器的时候,给容器加特权,及加上 --privileged=true 参数:
docker run -i -t -v /soft:/soft --privileged=true 637fe9ea94f0 /bin/bash
2.临时关闭selinux: (我用这个解决的比较粗暴)
setenforce 0
3.添加selinux规则,改变要挂载的目录的安全性文本
如果是因为权限问题,在内网环境 重复 私包发布 1-3步骤即可
7、注意docker 启动用户权限
这个大家自行百度即可。
2020-04-08 15:02:38 Power by DaTee
终于把 所有的坑都填上了。(Orz)
8、jenkins 集成vue项目,安装 node 环境就不说了。自行百度。
今天在linux上 又遇到了 node-sass 离线安装问题
总是去 github上找 ****.node 文件
尝试了 在windows 上的解决方案,跪了。又坑了一下午。
最后下班前5分钟,灵机一动,单独安装 node-sass 并加 sass_binary_site 参数。
搞定,上一段 jenkins 脚本
#!/bin/bash
echo $PATH
pwd
cd ./ecdp-platform-ui
npm config set registry http://100.54.34.6:4873
# 就是这行 单独安装 node-sass 花了一下午时间换来的
npm i node-sass --sass_binary_site=http://100.54.34.6:9500
npm install
npm run build:prod
2020-04-09 17:00:00 by 心力交瘁的 DaTree. (Orz)
更多推荐
所有评论(0)