使用Docker搭建npm私有仓库

news/2025/1/8 15:13:25/文章来源:https://www.cnblogs.com/98kk/p/18657276

由于文章格式和图片解析问题,为了更好的阅读体验,读者可前往 阅读原文

在公司团队内一般都会拥有私有的工具包或者其他依赖,这些东西又是比较敏感的信息,因此如npm私库的搭建在公司内部必不可少。

私库搭建方式有很多,本篇通过docker+nexus3的进行搭建。
本人使用ARM架构Centos7.9虚拟机环境进行搭建,请你阅前了解

扫码关注攻粽号,查看更多优质文章

image

安装docker

docker安装步骤可以参考本人的 docker安装一文

sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-enginesudo yum install -y yum-utils
sudo yum-config-manager \--add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 查看可安装的docker版本
sudo yum list docker-ce --showduplicates | sort -rsudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 启动docker
sudo systemctl start docker

安装nexus3

  1. 这里采用宿主机卷映射,先创建nexus配置卷

    mkdir -p /srv/nexus# 授权
    chown -R 200 /srv/nexus
    
  2. 下载镜像并运行

    这里本人是在arm架构的Centos上安装的,需要支持arm架构的nexus镜像,由于官方镜像没有提供支持arm架构的镜像,这里选择了别人编译好的支持arm架构的镜像,你可以选择非arm架构的官方镜像

    # 启动nexus3容器,会从远程拉取镜像
    docker pull klo2k/nexus3 # arm架构# 运行容器
    docker run -d --name nexus3 --restart=always \-p 8081:8081 \-p 8000-8010:8000-8010 \-v /srv/nexus:/nexus-data \klo2k/nexus3
    

    nexus内部默认会使用8001作为http访问的端口,把它映射到主机上,然后再暴露一个端口范围供后续其他使用

  3. 运行后根据机器配置一般需要等待一段时间,你可以查看其运行日志:

    docker logs -f nexus3
    

初始密码

nexus的默认账户为admin,初始密码在容器内/nexus-data/admin.password文件中,如果你进行了卷挂载也可以在宿主机卷中查看

# 进入容器查看admin密码
docker exec nexus3 cat /nexus-data/admin.password
b75981d3-affe-45f1-ba6f-10046b8bc4b9# 挂载了数据卷可以进行本地查看
cat /srv/nexus/admin.password

访问nexus3

访问地址为YourIP:PORT如localhost:8081,用初始账号密码进行登录,admin/xxxxx ,初次进入后可以修改密码

nexus1

基本面板左侧可以查找对应的仓库包文件,Brower菜单进入可以看到对应的仓库

image-20230320162008106

image-20230320162051975

上面的设置按钮需要有权限才可以看到,当前admin用户,可以看到,你也可以创建其他用户并分配适当的权限,所有的仓库储存、角色权限等操作都在设置面板里配置。

通常我们只需要关注下图红框中的配置即可

image-20230320162812212

创建存储集

创建数据存储单元集用来存放数据,你可以将Blob store理解为存储文件的地方,repository相当于数据库用来映射文件路径。

为什么要创建Blob Store呢?当你创建了某个blobstore就会某个关联的repository的内容存储到这里,你可以创建多个blobstore关联多个repository,这样就防止了数据的污染。

点击左侧菜单Blob Stores ,然后点击右侧 Create Blob Store 按钮

image-20230320163655564

然后创建页面先选择数据类型,这里选择 File 类型,然后给数据存储单元命名,最好语义明确如:npm,方便以后查看,都填写后点击保存按钮即可,列表中就会看到刚刚创建的存储单元集合

image-20230320163718336

创建仓库

创建仓库关联存储集,点击左侧菜单Repositories ,然后点击右侧 Create Repository 按钮

image-20230320163852830

然后选择npm(hosted),这里你会看到有hosted、proxy、group三类npm仓库,三者区别后面会讲。

进入创建仓库配置页面,如下,需要填写仓库名称、存储集、发布策略

image-20230320164334735

注意以下几点:

  • 同一类型的仓库名需要唯一,防止和旧的仓库重名
  • 储存集选择你前面创建的存储集,如npm
  • 发布策略中包含集中策略:根据你的需求设置,这里选择允许重发
    • 允许重发
    • 禁止重发
    • 只读
    • 通过复制发布(不推荐)

      来自官方的解释:If you are using replication, this policy is automatically set to Deploy by Replication Only. This will block all deployment to the hosted repository except by the internal replication mechanism. You should not manually set this policy to Deploy by Replication Only. If you disable replication, Nexus Repository automatically restores your previous deployment policy.

最后点击创建仓库按钮,就可以在仓库列表中找到刚刚创建的仓库了

image-20230320165149705

点击copy按钮查看仓库地址

image-20230320165406279

创建角色

前面npm-hosted创建好后,其实就可以上传自己的npm包到这个仓库了,一般不会使用系统账户进行登录发包,所以需要创建新的用户并授权npm相关权限,因此需要创建对应的角色和权限

点击左侧Roles菜单栏,在右侧面板点击创建角色,填写对应的角色名、id、描述等(仍然推荐语义明确)

image-20230320165944937

然后选择对应的权限,搜索npm,点击Transfer All将所有加入右侧列表

image-20230320170145483

如果你有还需要其他权限可以自行添加,这里讲下除了可以选择权限外,也可以选择已经存在的角色,这样也会拥有其权限,效果一样

image-20230320170353059

最后点击保存

创建用户

有了角色就可以创建用户关联此角色了,点击左侧Users菜单,在右侧面板中点击创建用户

image-20230320170654757

  • 用户ID:用来登录npm的用户名
  • Firstname:显示名字,随意填
  • Lastname:随意填
  • Email:可以随意填
  • password:你的密码
  • status:用户状态,选择active

:::warning
以上红框中需要重视其他可以随意填
:::

接着关联角色,将刚刚创建的角色移入右侧,点击创建

image-20230320171019351

权限认证

有了相关的角色后,需要对一些权限添加认证,也就是需要登录认证,才可以进行操作

点击左侧Realms菜单,将你需要认证的权限移入右侧,点击保存

image-20230320171459435

发布npm包

  1. 本地使用npm初始化创建一个项目

    npm init -y
    

    这里package.json文件内容如下,主文件为index.js

    {"name": "test-deploy","version": "1.0.0","description": "","main": "index.js","scripts": {},"keywords": [],"author": "","license": "ISC"
    }
    
  2. 简单创建一个index.js文件:

    const add = (x, y) => x + y;module.exports = {add
    }
    
  3. 设置npm仓库,你可以使用npm config set registry xxxx 创建,这里推荐在项目创建.npmrc文件

    # 地址改为自己 npm-hosted 仓库地址
    registry=http://192.168.10.10:8081/repository/npm-hosted/
    

    或者在package.json中添加:

    "publishConfig": {"registry": "http://192.168.10.10:8081/repository/npm-hosted/"}
    

    image-20230320172745102

  4. 登录并发布

    # 使用创建的用户登录
    npm login
    

    image-20230320173208309

    # 发布
    npm publish
    

    image-20230320173258611

  5. 在仓库中查看

    image-20230320173512796

    image-20230320173424057

验证npm包

在一个新项目中安装上传的npm包,注意如果你没有设置npm全局仓库配置,需要创建.npmrc添加npm仓库

image-20230320174205932

可以看到安装成功,接着创建index.js文件并引用里面的add方法

// index.js
const { add } = require('test-deploy');
console.log(add(1,2));

image-20230320174525384

可以看到运行成功

这里有一个坑,之所以安装成功,是因为我们的库中没有依赖其他的npm包,如果有依赖私有仓库没有的npm包,这里安装时就会报错,我们复现下:

重新在我们的npm包里安装一个私有仓库没有的依赖,这里安装day,注意需要先把.npmrc中的仓库注释掉,这样可以从官方的npm仓库中下载

# test-deploy 中安装 day
➜ devops test-deploy npm install day
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN test-deploy@1.0.0 No description
npm WARN test-deploy@1.0.0 No repository field.+ day@0.0.2
added 1 package from 1 contributor and audited 1 package in 1.57s
found 0 vulnerabilities

修改版本号:

{"name": "test-deploy","version": "1.0.1","description": "","main": "index.js","scripts": {},"keywords": [],"author": "","license": "ISC","dependencies": {"day": "0.0.2"}
}

重新发布:注意.npmrc添加仓库地址

➜ devops test-deploy npm publish
npm notice
npm notice 📦  test-deploy@1.0.1
npm notice === Tarball Contents ===
npm notice 56B  index.js
npm notice 208B package.json
npm notice === Tarball Details ===
npm notice name:          test-deploy
npm notice version:       1.0.1
npm notice package size:  305 B
npm notice unpacked size: 264 B
npm notice shasum:        47437424c9652266929c74a9870e54c0fb0db253
npm notice integrity:     sha512-zU8+K0q2vJWgD[...]NSzuMA5PKURmw==
npm notice total files:   2
npm notice
+ test-deploy@1.0.1

在另一个项目中重新安装我们的包:

➜ devops use-npm-package rm -rf node_modules package-lock.json
➜ devops use-npm-package npm i
npm ERR! code E404
npm ERR! 404 Not Found - GET http://192.168.10.10:8081/repository/npm-hosted/day - Package 'day' not found
npm ERR! 404
npm ERR! 404  'day@0.0.2' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
npm ERR! 404 It was specified as a dependency of 'test-deploy'
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.npm ERR! A complete log of this run can be found in:

发现安装失败,说npm ERR! 404 Not Found - GET http://192.168.10.10:8081/repository/npm-hosted/day - Package 'day' not found,也就是在我们的私有仓库中找不到daynpm包,其实npm下载时,也会下载包的依赖,所以会造成这种现象。接下来介绍proxy、group两种类型的仓库

proxy和group仓库

nexus3准备了3种仓库类型:

  • hosted:本地存储仓库,说白了就是用nexus托管存储包的仓库
  • proxy:代理仓库,可以代理到其他仓库,如npm官方仓库、淘宝仓库
  • group:组合多个仓库为一个地址

了解了这几种仓库类型,就可以解决上面的问题了,通过proxy代理其他的仓库,然后使用group关联hosted和proxy,这样在安装包文件时对于私库不存在的包就会代理到其他仓库下载

创建proxy

image-20230320182138263

选择存储集为npm,点击创建

image-20230320182220009

创建group

创建仓库选择npm(group),选择存储集,将npm(hosted)npm(proxy)选中移入右侧后创建

image-20230320182346688

这样就可以使用npm(group)的地址作为npm私库地址了

:::warning
需要注意的是,右侧的顺序有优先级,当多个仓库都有同一个包时,优先下载第一个仓库的包
:::

验证私库

需要注意的是发布包到npm-group是个付费功能😂,你可以发布包的时候用npm-hosted地址,安装包时用npm-group

修改.npmrc为你的group地址

# .npmrc
registry=http://192.168.10.10:8081/repository/npm-group/# hosted也行,重新拉取
registry=http://192.168.10.10:8081/repository/npm-hosted/

重新安装,查看day也被成功安装了

➜ devops use-npm-package npm i
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN use-npm-package@1.0.0 No description
npm WARN use-npm-package@1.0.0 No repository field.added 2 packages from 1 contributor in 0.108s
➜ devops use-npm-package tree -a
.
├── index.js
├── node_modules
│   ├── day
│   │   ├── day.js
│   │   ├── package.json
│   │   └── readme.md
│   └── test-deploy
│       ├── index.js
│       └── package.json
├── .npmrc
├── package.json
└── package-lock.json3 directories, 9 files
➜ devops use-npm-package node index.js
3

打标签

npm version 1.0.1# 没有指定标签,默认为latest
npm publish --tag beta# 查看包信息
npm info packageName# 示例
➜ devops test-deploy npm info test-deploytest-deploy@1.0.3 | ISC | deps: 1 | versions: 6dist
.tarball: http://192.168.10.10:8081/repository/npm-hosted/test-deploy/-/test-deploy-1.0.3.tgz
.shasum: e2dde05711a25e6c9df33567ae205f603eeeaead
.integrity: sha512-3pNZUUkDsupK7F0gzGWQXh4rFpZVvfHs+6brPKmA9oxnSyYbmb0L9NDH5+BW2iBRGYgS91UXwOQWiJJHgfo9cg==dependencies:
day: 0.0.2dist-tags:
beta: 1.0.3    latest: 1.0.3published 5 minutes ago

由于文章格式和图片解析问题,为了更好的阅读体验,读者可前往 阅读原文

不断更新中...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865254.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

认识Token和Cookie

认识Token和Cookie 1、token和cookie有什么区别? ​ 1.1 存储位置及方式:Cookie是浏览器用来存储本地信息的文件,有一定的存储限制,而Token是由服务器按一定算法生成的密令,可以由前端指定存放到localStorage、sessionStorage或cookie中。 ​ 1.2 功能特性:每次浏览器…

开发微信小程序游戏,有没有类似Debug真机图形的方法

1)开发微信小程序游戏,有没有类似Debug真机图形的方法2)Unity中如何实现动态实时的车削效果3)动态创建的Texture,有什么办法可以让他保持ASTC么4)Unity转微信小游戏的日志问题这是第416篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术…

CDS标准视图:维护通知任务数据 I_MaintNotificationTaskData

视图名称:维护通知任务数据 I_MaintNotificationTaskData 视图类型:基础 视图代码:IW67/IW23点击查看代码 @AbapCatalog.sqlViewName: INOTIFTASKDATA @AbapCatalog.compiler.compareFilter: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: Maintenan…

清单管理系统如何助力企业数字化转型?工具选择指南

一、数字化转型中的清单管理系统作用与意义 数字化转型意味着企业通过新兴技术提升工作效率、增强管理能力和客户服务。作为数字化工具的重要组成部分,清单管理系统在现代企业管理中具有不可替代的作用。它不仅帮助企业构建有序、高效的工作环境,还能优化资源配置、提升协作效…

2025年广告第一单,试试这款永久免费的开源BI工具

元旦之后,我们和国内领先的开源软件公司飞致云达成了重要合作,合作分两部分,一是推广飞致云旗下的免费开源软件,一是双方合作推出联合会员。飞致云旗下有多款免费开源软件,1月6日上线了第一个文字链广告,推广的是是飞致云旗下永久免费的开源 BI 工具 —— DataEase元旦之…

桌面式车载网络自动化测试系统TESTBASE-DESKNAT

车载网络是汽车电子控制系统交互的桥梁,直接影响整车功能实现及可靠性。经纬恒润在国内较早开展车载网络测试业务,深耕网络技术20多年,现基于自主车载网络测试工具VBA以及丰富的工程经验,推出桌面式网络自动化测试系统TestBase_DESKNAT(Desk Network Automatic Test)2.0产…

2025年测试用例管理看这一篇就够了 ----Codes 开源免费、全面的测试管理解决方案

Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台,支持云端认证、本地部署、全部功能开放,并且对 30 人以下团队免费。它通过整合迭代、看板、度量和自动化等功能,简化测试协同工作,使敏捷测试更易于实施。并提供低成本的敏捷测试解决方案,如同步在线离线测试用例、…

“面面俱到”!人脸活体检测让应用告别假面攻击

随着人脸识别技术在金融、医疗等多个领域的加速落地,网络安全、信息泄露等问题愈为突出,用户对应用稳定性和安全性的要求也更为严格。 HarmonyOS SDK 场景化视觉服务(Vision Kit)提供人脸动作活体检测能力,增强对于非活体攻击的防御能力和活体通过率。在投资理财、在线支付…

ITSM落地经验之建设蓝图规划

ITSM的规划建设不同于数字化转型规划,更多体现在管理中基本要素变革的规划,传统的ITSM规划重点在于流程规划。在过去,结合大部分客户实施ITSM效果较差或失败的现象来看,这些组织往往忽略了对组织文化与管理实践的诊断和规划,我们的建议在规划阶段充分对流程、文化、管理实…

el-form validator的校验提示遮盖下边的内容

问题:表单的validator校验,无法自动撑起tip提示的高度,导致遮盖了下边内容 https://blog.csdn.net/xiaoyuer_2020/article/details/136155506 解决方式:将tip提示的样式的定位设置为遵循正常的文档流对象,实现自适应高度.el-form-item .el-form-item__content .el-form-i…

国产化板卡设计原理图:2136-KC705E增强版基于FMC接口的 JFM7K325T PCIeX8 接口卡

KC705E增强版基于FMC接口的 JFM7K325T PCIeX8 接口卡 一、板卡概述 本板卡基于 FPGA JFM7K325T 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows,Linux驱动。二、功能和技术指标: 板卡…