遷移 Nexus 軟體倉庫拾遺
國慶前,我把之前老裝置上面執行的服務進行了完整的遷移。但是在遷移程式碼倉庫的過程中,發現有一些小細節挺有意思的。
啟動新的倉庫服務例項
因為我的所有服務配置都儲存在了 CVS 系統中,所以在新的機器上啟動服務,只需要Git Clone
、docker-compose up
兩步走。
然後在DNSMASQ
中將解析從老裝置指向到新裝置即可,比如:
address=/docker.lab.com/10.11.12.232 address=/npm.lab.com/10.11.12.232 address=/nexus.lab.com/10.11.12.232
進行倉庫資料遷移
之前我儲存持久化資料使用的是Mount
方式,這樣做的好處是幾乎不存在執行docker prune
等操作誤傷有用資料的情況。
但是缺點也明顯,簡單的打壓縮包,進行資料遷移對於這種場景不好使。
這裡有一個簡單的方案:將之前儲存在老倉庫的軟體包進行批量下載,然後重新推送到新的倉庫。
轉移 Docker 映象
使用docker pull
把要轉移的映象下載完畢後,使用docker images
命令,配合grep
以及awk
可以快速的篩選出需要進行轉移的映象名稱和版本。
$ docker images | grep 'docker.lab.com' | grep -v '<none>' | awk '{printf("%s:%s\n", $1, $2)}' docker.lab.com/hugo-post-adapter:1.0.0-convert docker.lab.com/aria2:1.0.0 docker.lab.com/pushover.lab.com:0.0.1 docker.lab.com/sonar.lab.com:7.3 ...
然後使用xargs
將這些映象逐個推送到新倉庫即可。
$ docker images | grep 'docker.lab.com' | grep -v '<none>' | awk '{printf("%s:%s\n", $1, $2)}' | xargs -I {} docker push {} The push refers to repository [docker.lab.com/hugo-post-adapter] d48cccfd71ab: Pushed d04f8a556ca9: Pushed e58056ca81cc: Pushed 984705602673: Pushed 6a2901185647: Pushed 2d4ed44f6fa7: Pushed 35e23a957234: Pushed 894a6015dedf: Pushed 2d790067a9f7: Pushed 32b5d1364b1c: Pushed fbebd655f9aa: Pushed 90e156c66608: Pushed a5a2fa193409: Pushed bc912d07a289: Pushed 905f2907ec29: Pushed 73046094a9b8: Pushed 1.0.0-convert: digest: sha256:fe391b4bcd2f2af0373b969f68f3f56a0ca1ac097257160c4abf135d31d39a7d size: 3668 The push refers to repository [docker.lab.com/aria2] 165e36b92662: Pushed a1da261fbc00: Pushed 5e8644249a98: Pushed
當然,如果你要全面進行備份,而不是簡單的重新推送映象到新倉庫的話,可以用下面的指令碼:
docker images | tail -n +2 | grep -v "<none>" | awk '{printf("%s:%s\n", $1, $2)}' | while read IMAGE; do echo "find image: $IMAGE" filename="$(echo $IMAGE| tr ':' '-' | tr '/' '-').tar" echo "save as $filename" docker save ${IMAGE} -o $filename done
轉移 NPM 包
這個就更簡單了,使用git checkout releaseTag
,然後重新npm pub
就完事了。
Nexus 3.3.x 映象許可權問題
如果你使用了 Nexus 3.3.x 版本的映象,並且將資料對映到了外部檔案系統,大概率會遇到下面的報錯。
mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied mkdir: cannot create directory '../sonatype-work/nexus3/tmp': Permission denied Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file ../sonatype-work/nexus3/log/jvm.log due to No such file or directory
解決方法很簡單,在你對映的外部檔案系統中執行下面的命令,將目錄許可權歸屬設定為200
。
sudo chown -R 200 ~/dockerVolume/nexus
最後
Nexus 相比一些後起之秀而言,管理介面可能相對簡單了一些,但是不論是資源佔用,還是軟體整體的穩定性來說,都十分優秀。
在我使用了快一年的時間裡,在上面積累了接近 5G 的程式碼包(hosted+proxy)和映象檔案(hosted),遷移時發現產生的磁碟碎片僅有100M不到,而且支援叢集模式,以及市面上幾乎所有的語言倉庫協議,具備定時任務…
如果你或者你的團隊在使用 CI/CD 進行敏捷開發,但是又缺乏一個穩定的內部倉庫,可以試試這款不錯的軟體。
如果你有意向瞭解或者學習 Nexus 的搭建和使用,或許我可以寫一篇詳細的從搭建到使用。
—EOF