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