docker 私库尝试与发布
由于当前 memos
有一些地方不满足使用,所以决定进行一点二开,正好学习 React
和 Golang
了。改完之后就涉及到需要构建镜像并发布,记录一下涉及到的问题。
私库没有鉴权,所以以下域名都是示例域名,仅供参考
镜像构建
配置国内镜像加速,我在 Mac
上使用的是 orbstack
,所以配置文件的地址和 docker
不太一样,但是配置是相通的。因为是基于开源项目改的,所以项目中已经有 Dockerfile
文件,文件内容就不赘述了,直接执行镜像打包,生成本地镜像
vim ~/.orbstack/config/docker.json
{
"registry-mirrors" : [
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
# 打包镜像,-t 参数意义是打 tag
docker build -t jjdxb/memos:latest .
# 重命名镜像
docker tag jjdxb/memos:latest good/memos:latest
镜像发布
创建私库
这里我直接在我的云服上,搭建一个简单的私库用于存放该镜像,因为往 dockerHub 上发布总遇到网络问题,而我这个镜像主要是自用的,所以考虑使用私库来承载,参考文档 。
# 通过镜像启动服务并配置镜像存放地址
docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry
# 查看仓库中的镜像
curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]}
这样,其实一个简单的私库就搭好了
配置域名
用 ip
访问太麻烦了,自然要配置一个子域名指向,便于镜像推送,已经查询已有镜像, nginx
配置如下:
server {
listen 80;
server_name test.domain.xxx;
return 301 https://${server_name}$request_uri;
}
server {
listen 443 ssl;
server_name test.domain.xxx;
charset utf-8;
access_log /var/log/nginx/x.access.log;
error_log /var/log/nginx/x.error.log;
include conf.d/ssl.configure;
location / {
proxy_redirect http:// https://;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://172.17.0.1:5000/;
}
}
通过 https://test.domain.xxx/v2/_catalog 访问,可以看到仓库信息,齐活!
PS: 有一说一,太久没倒腾了,配了 nginx
之后试来试去都是无法访问,想了半天才明白过来, dns
解析记录没加呢,这能访问个锤子!
推送镜像到私库
docker tag jjdxb/memos:latest test.domain.xxx/memos:latest
docker push test.domain.xxx/memos:latest
The push refers to repository [test.domain.xxx/memos]
db88005e10a9: Layer already exists
c061669539ad: Layer already exists
176bfe7afbe4: Pushed
cab81ae62378: Layer already exists
e38ada1ac96e: Layer already exists
a16e98724c05: Layer already exists
latest: digest: sha256:96539d57bb5a7486133745f306725dd53bdfc29a5000b72c8baefbf1d51213a6 size: 1571
# 看到这样的提示,就是推送成功啦
遇到的问题
问题一:unknown blob
docker push test.domain.xxx/memos:latest
The push refers to repository [test.domain.xxx/memos]
db88005e10a9: Pushing 3.072kB
c061669539ad: Pushing [==================================================>] 3.584kB
176bfe7afbe4: Preparing
cab81ae62378: Pushing [===> ] 36.86kB/498.8kB
e38ada1ac96e: Pushing 2.56kB
a16e98724c05: Waiting
unknown blob
执行推送命令后提示 unknown blob
,推测是 docker push
只能以 https
的方式。解决方案,在 nginx
中添加配置 proxy_redirect http:// https://;
,改之前这里的值是 off
,改完之后就不会提示 unknown blob
了。
问题二:413 Request Entity Too Large
docker push test.domain.xxx/memos:latest
The push refers to repository [test.domain.xxx/memos]
db88005e10a9: Pushed
c061669539ad: Pushed
176bfe7afbe4: Pushing [==================================================>] 55.56MB/55.56MB
cab81ae62378: Pushed
e38ada1ac96e: Pushed
a16e98724c05: Pushed
unknown: <html>
<head><title>413 Request Entity Too Large</title></head>
<body>
<center><h1>413 Request Entity Too Large</h1></center>
<hr><center>nginx/1.23.1</center>
</body>
</html>
解决了 nginx
配置问题后,再次推送,每次都会在其中一步卡住,卡住之后过几秒会自动重试,但还是会卡住,最后给出提示是 413
,查了下应该是 nginx
设置的客户端上传 size
限制,改了配置文件中 client_max_body_size 100M;
,再次推送,就成功了。
问题三:linux 上运行容器报错
打出的镜像运行容器报错,原因是 docker 构建镜像的时候默认按操作平台构建出的是 linux/arm64 的镜像,所以打出的镜像在 Mac 上运行容器可用,但是在 linux 上运行会报错,解决办法是重新按照 linux/amd64 打包镜像即可(对应 linux x86_64 架构)
# 报错信息
exec ./entrypoint.sh: exec format error
# 重新打包命令
docker buildx build --platform linux/amd64 -t jjdxb/memos:latest .
小结
总的来说,以这种方式搭建私库还是比较简单方便的,比较适合个人快速尝试,遇到的问题,基本网上都有解。关于 memos 项目的二开,改天再写文章记录下。