@@ -72,19 +72,23 @@ def _docker_build(config):
7272 """
7373 Internal multiprocess method to run docker build command
7474 """
75- c , version = config
76- print (f" -- Starting docker build for version : { version } " )
77- build_command = f"docker build --build-arg redis_version={ version } -t grokzen/redis-cluster:{ version } ."
75+ c , version , platforms = config
76+ print (f" -- Starting docker build for version : { version } on platforms: { platforms } " )
77+ # Create buildx builder if it doesn't exist
78+ c .run ("docker buildx create --use --name redis-cluster-builder || docker buildx use redis-cluster-builder" , warn = True )
79+ build_command = f"docker buildx build --platform={ platforms } --build-arg redis_version={ version } -t grokzen/redis-cluster:{ version } --load ."
7880 c .run (build_command )
7981
8082
8183def _docker_push (config ):
8284 """
83- Internal multiprocess method to run docker push command
85+ Internal multiprocess method to run docker push command with multi-arch support
8486 """
85- c , version = config
86- print (f" -- Starting docker push for version : { version } " )
87- build_command = f"docker push grokzen/redis-cluster:{ version } "
87+ c , version , platforms = config
88+ print (f" -- Starting docker push for version : { version } with platforms: { platforms } " )
89+ # Use buildx to build and push multi-arch images
90+ c .run ("docker buildx create --use --name redis-cluster-builder || docker buildx use redis-cluster-builder" , warn = True )
91+ build_command = f"docker buildx build --platform={ platforms } --build-arg redis_version={ version } -t grokzen/redis-cluster:{ version } --push ."
8892 c .run (build_command )
8993
9094
@@ -103,33 +107,65 @@ def pull(c, version, cpu=None):
103107
104108
105109@task
106- def build (c , version , cpu = None ):
107- print (f" -- Docker building version : { version } " )
110+ def build (c , version , cpu = None , platforms = "linux/amd64,linux/arm64" ):
111+ print (f" -- Docker building version : { version } for platforms : { platforms } " )
108112
109113 pool = Pool (get_pool_size (cpu ))
110114 pool .map (
111115 _docker_build ,
112116 [
113- [c , version ]
117+ [c , version , platforms ]
114118 for version in version_name_to_version (version )
115119 ],
116120 )
117121
118122
119123@task
120- def push (c , version , cpu = None ):
121- print (f" -- Docker push version to docker-hub : { version } " )
124+ def push (c , version , cpu = None , platforms = "linux/amd64,linux/arm64" ):
125+ print (f" -- Docker push version to docker-hub : { version } for platforms : { platforms } " )
122126
123127 pool = Pool (get_pool_size (cpu ))
124128 pool .map (
125129 _docker_push ,
126130 [
127- [c , version ]
131+ [c , version , platforms ]
132+ for version in version_name_to_version (version )
133+ ],
134+ )
135+
136+
137+ @task
138+ def buildx (c , version , cpu = None , platforms = "linux/amd64,linux/arm64" , push = True ):
139+ """
140+ Build multi-architecture images using docker buildx.
141+ This is more efficient than separate build and push commands for multi-arch.
142+ """
143+ print (f" -- Docker buildx for version : { version } on platforms : { platforms } (push={ push } )" )
144+
145+ # Create buildx builder if it doesn't exist
146+ c .run ("docker buildx create --use --name redis-cluster-builder || docker buildx use redis-cluster-builder" , warn = True )
147+
148+ pool = Pool (get_pool_size (cpu ))
149+ pool .map (
150+ _docker_buildx ,
151+ [
152+ [c , version , platforms , push ]
128153 for version in version_name_to_version (version )
129154 ],
130155 )
131156
132157
158+ def _docker_buildx (config ):
159+ """
160+ Internal multiprocess method to run docker buildx command
161+ """
162+ c , version , platforms , push = config
163+ action = "--push" if push else "--load"
164+ print (f" -- Starting docker buildx for version : { version } on platforms: { platforms } with action: { action } " )
165+ build_command = f"docker buildx build --platform={ platforms } --build-arg redis_version={ version } -t grokzen/redis-cluster:{ version } { action } ."
166+ c .run (build_command )
167+
168+
133169@task
134170def list (c ):
135171 from pprint import pprint
0 commit comments