Skip to content

Commit f9f0758

Browse files
authored
update image_syncer (#90)
1 parent c0f6c2d commit f9f0758

File tree

2 files changed

+43
-28
lines changed

2 files changed

+43
-28
lines changed

docker_docker_kit/work/image-syncer/run_jobs.py

+16-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import multiprocessing
12
import os
2-
import json
33
import sys
4+
45
import yaml
56

67
import run_sync
@@ -23,27 +24,29 @@ def get_job_names_from_yaml(file_path):
2324

2425

2526
def main():
26-
namespace = os.environ.get('IMG_NAMESPACE')
27-
if namespace is None:
28-
print('Using default IMG_NAMESPACE=library !')
29-
namespace = 'library'
27+
img_namespace = os.environ.get('IMG_NAMESPACE', 'library')
28+
registry_url_src = os.environ.get("REGISTRY_URL", 'docker.io')
29+
registry_url_dst = os.environ.get("DOCKER_MIRROR_REGISTRY", None)
3030

3131
images = []
3232
job_names = get_job_names_from_yaml('.github/workflows/build-docker.yml')
3333
for name in job_names:
3434
images.extend(name.split(','))
3535

36+
list_tasks = []
3637
for image in images:
37-
img = '/'.join([namespace, image])
38+
img = '/'.join([img_namespace, image])
3839
print("Docker image sync job name found:", img)
39-
configs = run_sync.generate(image=img, tags=None)
40+
configs = run_sync.generate(
41+
image=img, tags=None, source_registry=registry_url_src, target_registries=registry_url_dst
42+
)
4043
for _, c in enumerate(configs):
41-
s_config = json.dumps(c, ensure_ascii=False, sort_keys=True)
42-
print('Config item:', json.dumps(c, ensure_ascii=False, sort_keys=True))
43-
ret = run_sync.sync_image(cfg=c)
44-
if ret != 0:
45-
return ret
46-
return ret
44+
list_tasks.append(c)
45+
46+
with multiprocessing.Pool() as pool:
47+
res = pool.map_async(run_sync.sync_image, list_tasks)
48+
ret = sum(res.get())
49+
return ret
4750

4851

4952
if __name__ == '__main__':

docker_docker_kit/work/image-syncer/run_sync.py

+27-15
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
import tempfile
77

88

9-
def generate(image: str, target_registries: list = None, tags: list = None, target_image: str = None):
9+
def generate(image: str, source_registry: str = None, target_registries: list = None, tags: list = None):
1010
"""Generate a config item which will be used by `image-syncer`."""
11-
uname = os.environ.get('DOCKER_MIRROR_REGISTRY_USERNAME', None)
12-
passwd = os.environ.get('DOCKER_MIRROR_REGISTRY_PASSWORD', None)
11+
uname_mirror = os.environ.get('DOCKER_MIRROR_REGISTRY_USERNAME', None)
12+
passwd_mirror = os.environ.get('DOCKER_MIRROR_REGISTRY_PASSWORD', None)
1313

14-
if uname is None or passwd is None:
14+
if uname_mirror is None or passwd_mirror is None:
1515
print('ENV variable required: DOCKER_MIRROR_REGISTRY_USERNAME and DOCKER_MIRROR_REGISTRY_PASSWORD !')
1616
sys.exit(-2)
1717

@@ -20,16 +20,27 @@ def generate(image: str, target_registries: list = None, tags: list = None, targ
2020
destinations = ['cn-beijing', 'cn-hangzhou']
2121
target_registries = ['registry.%s.aliyuncs.com' % i for i in destinations]
2222

23-
for dest in target_registries:
24-
src = "%s:%s" % (image, tags) if tags is not None else image
25-
yield {
23+
for target_registry in target_registries:
24+
img_src_tag = '%s:%s' % (image, tags) if tags is not None else image
25+
img_src: str = "%s/%s" % (source_registry, img_src_tag)
26+
img_dst: str = "%s/%s" % (target_registry, image)
27+
28+
c = {
2629
'auth': {
27-
dest: {"username": uname, "password": passwd}
30+
target_registry: {"username": uname_mirror, "password": passwd_mirror}
2831
},
29-
'images': {
30-
src: "%s/%s" % (dest, target_image or image)
31-
}
32+
'images': {img_src: img_dst}
3233
}
34+
if source_registry is not None:
35+
uname_source = os.environ.get('DOCKER_REGISTRY_USERNAME', None)
36+
passwd_source = os.environ.get('DOCKER_REGISTRY_PASSWORD', None)
37+
if uname_source is None or passwd_source is None:
38+
print('ENV variable required: DOCKER_REGISTRY_USERNAME and DOCKER_REGISTRY_PASSWORD !')
39+
sys.exit(-2)
40+
c['auth'].update({source_registry: {
41+
"username": uname_source, "password": passwd_source}
42+
})
43+
yield c
3344

3445

3546
def sync_image(cfg: dict):
@@ -50,13 +61,14 @@ def main():
5061
parser = argparse.ArgumentParser()
5162
parser.add_argument('img', type=str, help='Source image, with or without tag')
5263
parser.add_argument('--tags', type=str, action='extend', nargs='*', help='Tags to sync, optional.')
53-
parser.add_argument('--dest-image', type=str, help='Target image name, with our without tag')
54-
parser.add_argument('--dest-registry', type=str, action='extend', nargs='*', help='tTarget registry URL')
64+
parser.add_argument('--source-registry', type=str, default='docker.io', help='Target image name, with our without tag')
65+
parser.add_argument('--target-registry', type=str, action='extend', nargs='*', help='Target registry URL')
5566
args = parser.parse_args()
5667

57-
configs = generate(image=args.img, tags=args.tags, target_registries=args.dest_registry, target_image=args.dest_image)
68+
configs = generate(image=args.img, tags=args.tags, source_registry=args.target_registry, target_registries=args.dest_registry)
69+
ret = 0
5870
for _, c in enumerate(configs):
59-
ret = sync_image(cfg=c)
71+
ret += sync_image(cfg=c)
6072
return ret
6173

6274

0 commit comments

Comments
 (0)