使用Docker搭建npm私有仓库

news/2025/1/9 16:06:32 标签: docker, npm, 容器, devops, 前端

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

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

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

docker_9">安装docker

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

sudo yum remove docker \
  docker-client \
  docker-client-latest \
  docker-common \
  docker-latest \
  docker-latest-logrotate \
  docker-logrotate \
  docker-engine

sudo 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 -r

sudo 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_194">发布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_267">验证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 中安装 daydevops 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.json

3 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-deploy

test-deploy@1.0.3 | ISC | deps: 1 | versions: 6

dist
.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.2

dist-tags:
beta: 1.0.3    latest: 1.0.3

published 5 minutes ago

不断更新中…

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


http://www.niftyadmin.cn/n/5817714.html

相关文章

JS进阶--JS听到了不灭的回响

作用域 作用域(scope)规定了变量能够被访问的“范围”,离开了这个“范围”变量便不能被访问 作用域分为局部和全局 局部作用域 局部作用域分为函数和块 那 什么是块作用域呢? 在 JavaScript 中使用 { } 包裹的代码称为代码块…

【集成学习】Bagging算法详解及代码实现

文章目录 1. Bagging集成学习算法1.1 简介1.2 基本步骤1.3 Bagging优缺点1.4 随机森林:Bagging的一个重要应用1.5 总结 2. Python代码实现3. 如何理解偏差与方差3.1 偏差(Bias)3.2 方差(Variance)3.3 方差与偏差的权衡…

MT6835天玑6100平台规格参数_MTK联发科安卓核心板方案定制开发

联发科MT6835平台集成了蓝牙、FM、WLAN 和 GPS 模块,是一个高度集成的基带平台。该芯片集成了两个 Arm Cortex-A76 内核(运行频率高达 2.2GHz)、六个 Arm Cortex-A55 内核(运行频率高达 2.0 GHz)和强大的多标准视频编解…

macOS 中,默认的 Clang 编译器和 Homebrew 安装的 GCC 都不包含 bits/stdc++.h 文件

在 macOS 中,默认的 Clang 编译器和 Homebrew 安装的 GCC 都不包含 bits/stdc.h 文件,因为它是一个 非标准 的头文件,主要由 MinGW 和某些 Linux 平台的 GCC 提供。 解决方案 : 手动创建 bits/stdc.h 1. 创建文件夹和文件 在你的 GCC 标准…

电脑32位和64位之区别(Difference between 32-Bit and 64 Bit Computers)

电脑32位和64位之区别 很多小伙伴还不知道电脑32位和64位是什么意思,今天小编就来普及一下。 32位和64位是指电脑处理器(CPU)和操作系统的架构,决定了电脑如何处理数据、存储信息、运行程序等。 32位和64位是指电脑系统中每个处…

conda 批量安装requirements.txt文件

conda 批量安装requirements.txt文件中包含的组件依赖 conda install --yes --file requirements.txt #这种执行方式,一遇到安装不上就整体停止不会继续下面的包安装。 下面这条命令能解决上面出现的不执行后续包的问题,需要在CMD窗口执行: 点…

SSL 证书格式和证书文件扩展名:完整指南

SSL 证书是什么以及它如何工作相当容易理解。但当涉及到在服务器上安装它时,有时,你可能觉得这是在处理火箭科学。 由于有如此多的SSL 证书格式与特定服务器要求相关,您更有可能感到困惑和沮丧,而不是从一开始就正确配置证书。但…

DuckDB:PRAGMA语句动态配置数据库行为

PRAGMA语句是DuckDB从SQLite中采用的SQL扩展。PRAGMA命令可能会改变数据库引擎的内部状态,并可能影响引擎的后续执行或行为。本文介绍PRAGMA命令及其典型应用场景。 DuckDB PRAGMA介绍 在 DuckDB 中,PRAGMA 是一种编译指示(compiler directi…