Skip to content

Instantly share code, notes, and snippets.

@tiejunhu
Last active August 12, 2019 09:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tiejunhu/a4ef62a6fd73a240c5ee268a3f97a1a8 to your computer and use it in GitHub Desktop.
Save tiejunhu/a4ef62a6fd73a240c5ee268a3f97a1a8 to your computer and use it in GitHub Desktop.
用于在墙内下载docker.io和k8s.gcr.io的镜像,镜像服务由 http://mirror.azure.cn/ 提供。脚本会自动将输入的镜像名称转换为正确的镜像下载地址,下载后再tag为正确的镜像名称。支持的镜像名称规范可以看下面28行开始的usage()函数。
#!/usr/bin/python
# coding=utf8
import os
import sys
DEFAULT_DOCKER_HUB_URL = "docker.io"
GCR_URL = "k8s.gcr.io"
mirror_map = {
"default": "dockerhub.azk8s.cn/library",
DEFAULT_DOCKER_HUB_URL: "dockerhub.azk8s.cn",
"gcr.io": "gcr.azk8s.cn",
GCR_URL: "gcr.azk8s.cn"
}
url_default_namespace_map = {
DEFAULT_DOCKER_HUB_URL: "library",
GCR_URL: "google_containers"
}
def execute_sys_cmd(cmd):
result = os.system(cmd)
if result != 0:
print(cmd + " failed.")
sys.exit(-1)
def usage():
print("Usage: " + sys.argv[0] + " pull ${image}")
print("Support the following image spec:")
print("\tdocker.py pull nginx:alpine")
print("\tdocker.py pull library/nginx:alpine")
print("\tdocker.py pull docker.io/nginx:alpine")
print("\tdocker.py pull docker.io/library/nginx:alpine")
print("\tdocker.py pull docker.io/istio/mixer")
print("\tdocker.py pull k8s.gcr.io/pause:latest")
print("\tdocker.py pull gcr.io/google_containers/pause:latest")
if __name__ == "__main__":
if len(sys.argv) != 3 or sys.argv[1] != "pull":
usage()
sys.exit(-1)
image = sys.argv[2]
elements = image.split("/")
URL = ""
namespace = ""
imageName = ""
# nginx:alpine
if len(elements) == 1:
URL = DEFAULT_DOCKER_HUB_URL
namespace = url_default_namespace_map[URL]
imageName = elements[0]
if len(elements) == 2:
if "." in elements[0]:
# docker.io/nginx:alpine
# k8s.gcr.io/pause:latest
URL = elements[0]
if URL not in url_default_namespace_map:
raise "Cannot find default namespace for " + image
namespace = url_default_namespace_map[URL]
imageName = elements[1]
else:
# library/nginx:alpine
# istio/mixer
URL = DEFAULT_DOCKER_HUB_URL
namespace = elements[0]
imageName = elements[1]
if len(elements) == 3:
URL = elements[0]
namespace = elements[1]
imageName = elements[2]
if URL not in mirror_map:
raise "Cannot find mirror for " + image
newImage = mirror_map[URL] + "/" + namespace + "/" + imageName
targetTagName = image
if URL == DEFAULT_DOCKER_HUB_URL:
if namespace == url_default_namespace_map[URL]:
targetTagName = imageName
else:
targetTagName = namespace + "/" + imageName
print("-- pulling image %s --" % image)
cmd = "docker pull {image}".format(image=newImage)
print("\t" + cmd)
execute_sys_cmd(cmd)
cmd = "docker tag {newImage} {image}".format(newImage=newImage, image=targetTagName)
print("\t" + cmd)
execute_sys_cmd(cmd)
cmd = "docker rmi {newImage}".format(newImage=newImage)
print("\t" + cmd)
execute_sys_cmd(cmd)
print("-- {image} pulling done --".format(image=image))
sys.exit(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment