专栏首页码力全开Verdaccio 使用 Docker 安装及迁移教程

Verdaccio 使用 Docker 安装及迁移教程

前言

Verdaccio 是一个 npm 私有源,代码在 GitHub 开源,公司由于业务需要使用也有一段时间,非常稳定,社区也很活跃。入门可以看我之前写的一篇文章:

npm私服安装教程 - verdaccio 入门

前一段时间由于所在服务器升级,顺便更新了下 Verdaccio 版本,并将之前的数据都迁移过来。由于公司服务器上有 docker,所以就使用 docker 来安装。

安装

下载镜像

先下载最新的 Verdaccio 镜像,使用官方的 docker 镜像

docker pull verdaccio/verdaccio

上面命令拉取的即是 latest 的镜像

启动前配置

如果没有安装 docker-compose,可以看文末链接。

在工作目录新建文件夹 npm,然后新建 docker-compose.yml 文件

mkdir npm && touch npm/docker-compose.yml

然后将以下配置粘贴到 docker-compose.yml 文件中:

version: '3.4'

services:
  verdaccio:
    image: verdaccio/verdaccio
    container_name: "verdaccio"
    networks:
      - node-network
    environment:
      - VERDACCIO_PORT=4873
    ports:
      - "4873:4873"
    volumes:
      - "./storage:/verdaccio/storage"
      - "./config:/verdaccio/conf"
      - "./plugins:/verdaccio/plugins"
networks:
  node-network:
    driver: bridge

上面配置即使用了刚才下载的 verdaccio 镜像,容器和宿主机都绑定在 4873 端口。同时挂载了当前目录的 storageconfigplugins 文件夹到容器内部。

如果需要修改端口号,就将上面配置文件中三个 4873 都改成其他端口号即可。

又由于启动时容器会去找 ./config/config.yaml 文件,所以在 config 文件夹新建该文件,填入以下内容:

storage: /verdaccio/storage
auth:
  htpasswd:
    file: /verdaccio/conf/htpasswd
uplinks:
  npmjs:
    url: https://registry.npm.taobao.org/
packages:
  '@*/*':
    access: $all
    publish: $authenticated
    proxy: npmjs
  '**':
    proxy: npmjs
logs:
  - {type: stdout, format: pretty, level: http}
  • htpasswd 文件是用来存储 npm 用户及密码信息的文件
  • uplinks 上游源改为了淘宝的镜像源,这样在下载找不到的包的时候就会从淘宝下载。
  • 需要注意的是,上面配置文件的路径都是针对 docker 容器内部来说的。

启动容器

执行以下命令启动:

docker-compose up -d --build

启动后通过访问 http://your.domain:4873 端口号应该就可以看到 Verdaccio 的 web 页面了,笔者安装时候的最新版本为 4.3.3

配置 nginx

如果 nginx 直接安装在宿主机,直接新建配置文件填入以下内容即可:

server {
  listen 80;
  server_name your.npm-server.com;
  location / {
    proxy_pass              http://127.0.0.1:4873/;
    proxy_set_header        Host $host;
  }
}

如果想使用跑在 docker 容器中的 nginx,首先查看一下 docker0 这个网卡的 ip 地址:

ifconifg

可以看到我用的服务器的 docker 虚拟网卡的ip 为:172.17.0.1

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:2f:ed:ec:0e  txqueuelen 0  (Ethernet)
        RX packets 30587  bytes 17826762 (17.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 38051  bytes 25920436 (24.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

然后将上面 nginx 配置文件中反向代理的 ip 地址改为该内网 ip 即可。

权限问题

打开刚才配置的域名即可看到 Verdaccio 的 web 界面,我们来新增用户测试一下:

npm adduser --registry http://your.npm-server.com

根据提示输入用户名和密码,最后却提示 500 服务器错误。

我们在服务器上执行以下命令查看容器日志:

docker logs --tail 20 verdaccio

发现:

EACCES: permission denied, open '/verdaccio/conf/htpasswd'

原来是没有权限。查了一番资料得知,用户在新增 npm 用户的时候会写入 htpasswd 文件,由于该文件是在宿主机中,默认是 root 用户建立的,而 verdaccio 容器中拥有自己的用户名,名字就叫 verdaccio,所以无法写入 root 用户拥有的文件。 那么是不是还要在宿主机上新建 verdaccio 用户呢?不用这么麻烦。根据官方文档和文末的最后一篇文章得知,docker 容器中的 uid 和 gid 和宿主机是共享的,只不过没有具体的名称,而容器内 verdaccio 使用的 uid 为 10001,gid 为 65533,所以我们在宿主机改一下 htpasswd 文件的权限:

sudo chown 10001:65533 htpasswd

然后再试一下添加用户,就可以成功了。

同理,storage 目录是 verdaccio 存放包数据的目录,也需要修改一下权限:

sudo chown -R 10001:65533 storage

然后试一下发布包,成功~

迁移

由于笔者是从 Verdaccio@3.0 升级到 4.3,所以将原服务器上的 config.yamlhtpasswdstorage 文件夹 scp 过去,然后修改一下权限即可。

scp config.yaml user@remoteServer:/path/to/config.yaml
scp htpasswd user@remoteServer:/path/to/htpasswd
scp -r storage user@remoteServer:/path/to/storage

同时迁移后注意修改 config.yaml 中的 htpasswdstorage 路径。

参考文章

  • Verdaccio 官方文档
  • docker-compose 安装加速
  • Understanding how uid and gid work in Docker containers

本文分享自微信公众号 - 码力全开(codingonfire),作者:savokiss

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [译] 写给前端工程师的 Docker 入门

    过去的我们,当业务发展需要部署新的应用时,DevOps 小伙伴通常会去买一台服务器,但是却不知道这个新应用具体需要多高的配置,往往都会造成资源浪费。

    savokiss
  • npm私服安装教程 - verdaccio 入门

    sinopia 之前好像很火,但是作者弃坑了,从项目里的一个issue(见文末)发现,有人fork了一个项目,就是本文要使用的 verdaccio,目前该项目在...

    savokiss
  • CentOS 7 使用 docker 安装 typecho 博客系统

    我的博客 https://savokiss.com 用的是 typecho,一直使用的是 阿里云ECS 直接安装的 MySQL 和 PHP,由于买的时间比较早,...

    savokiss
  • B程序员:讲述三年计算机学习辛酸史

    近年来,有些读者会问我一些形形色色的问题,让我很难去回答,甚至给不出建设性的意见。

    Guide哥
  • ip route、ip rule、iptables知多少?(1)

    基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应用或IP源地址等属性来选择转发路径。

    随心助手
  • No.3 啥是数据运营(三):思维方式

    今天这篇可以说是思维方式的总结,一共十四对我个人而言较为重要的思维方式,分享给大家。请不要嫌弃我的灵魂画作。 1.信号与噪音(信度与效度) 信度的英文为Reli...

    企鹅号小编
  • 利用 Harbor 搭建企业级私有镜像仓库

    docker中要使用镜像,一般会从本地、docker Hup公共仓库和其它第三方公共仓库中下载镜像,一般出于安全和外网(墙)资源下载速率的原因考虑企业级上不会轻...

    民工哥
  • 征服强化学习! Google AI 如何用ConQUR算法解决强化学习在应用落地上的难题

    众所周知,强化学习在应用落地和理论之间存在巨大的偏差,理想很美好,现实很骨感。Google AI围绕这个复杂的问题,在NeurIPS2018 最佳论文探讨并指出...

    新智元
  • Mysql主从复制搭建与深度原理分析

    首先,在docker下进行搭建mysql可以当做学习数据库搭建时的测试使用,docker的hub中有已经封装好的mysql可以避免我们进行数据库安装的复杂步骤,...

    用户7625070
  • MYSQL proxysql 在深入 信息获取和信息输出

    ProxySQL 前两期针对不同的MYSQL高可用的方式来说的, 本期会更加深入到PROXYSQL 的一些本身的东西.

    AustinDatabases

扫码关注云+社区

领取腾讯云代金券