2023年11月29日发(作者:)
JAVA调⽤harbor接⼝实现镜像tar包上传
前⾔
使⽤harbor过程中,⼀直想使⽤harbor的api实现镜像的上传功能,但是实际上harbor是直接调⽤了docker registry的api,harbor层只是
做了⼀个透传的功能,这个可以参考《harbor权威指南》这本书,参考官⽹接⼝以及⽹上⼤佬的思想,实现了⼀个Java版本,主要是实现了
docker daemon上传的逻辑。
docker镜像tar包结构
实现上传⾸先需要将镜像的tar包解压,读取⽬录结构,⼀个典型的docker镜像包(使⽤命令)结构如下:
docker save
.
├── 1ecf8bc84a7c3d60c0a6bbdd294f12a6b0e17a8269616fc9bdbedd926f74f50c
上传流程
1. 获取鉴权信息
2. 检查是否已经存在
3. 上传
4. 上传image config
@Service
@Slf4j
public class DockerImageUploadBiz {
//远程仓库
@Value("${}")
private String targetRepoAddress;
pushingManifest(project, layerPathList, configPath, imageName, tag);
("PUSHING ");
("PUSHING {} COMPLETED!", repo);
}
}
} catch (Exception e) {
("", e);
}
if ((blocks)) {
("File block is null!");
break;
}
offset += ;
(blocks);
("pushing range:[{}-{}]... {}%", index, offset, ("%.2f", (float) offset / (float) length * 100));
ManifestV2 manifestV2 = new ManifestV2()
.setMediaType("application/st.v2+json")
.setSchemaVersion(2);
File configFile = new File(configPath);
String hash256 = 256(configFile);
Config config = new Config()
FileOutputStream fos = new FileOutputStream(f);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int len;
while ((len = (buf)) != -1) {
(buf, 0, len);
}
();
();
}
}
();
return destPath;
*/
public static String byte2Hex(byte[] bytes) {
StringBuilder stringBuffer = new StringBuilder();
String temp;
for (byte b : bytes) {
temp = tring(b & 0xFF);
if (() == 1) {
// 1得到⼀位的进⾏补0操作
("0");
}
(temp);
}
protected static SSLSocketFactory createTrustAllSSLFactory(TrustAllManager trustAllManager) {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = tance("TLS");
}
/**
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
8. pom⽂件
引⽤: 1. /p/763bfbd29bd2 2. /registry/spec/api/#pushing-an-image


发布评论