#Multi Arch build using Python

1 messages · Page 1 of 1 (latest)

astral breach
#

My code for now :

"""Run tests for a single Python version."""

import sys
import anyio
import dagger
import os
async def docker_image_build():

    async with dagger.Connection(dagger.Config(log_output=sys.stderr)) as client:
        src = client.host().directory("./")

        blog = (
            client.container()
            .build(
                context = src,
                dockerfile = "Dockerfile",
                build_args=[
                    dagger.BuildArg("PKG_NAME", os.environ.get("PKG_NAME", "default-value"))
                    ]
            )
        )
        
        image = await blog.publish(address="ttl.sh/test_image:1h", platform_variants="linux/amd64,linux/arm64")

    print(f"Image is accessible at {image}")


if __name__ == "__main__":
    anyio.run(docker_image_build)
#

The error is around platform_variants="linux/amd64,linux/arm64")

I don't now which type of var I can put in this

flint iron
#

@astral breach I've not done any multi-platform building but you seem to be missing the looping over platforms with the container option setting that iteration's platform?

cursive lotus
astral breach
cursive lotus
#

@astral breach that should help! ☝️

#

We need to get this into the docs as a simple/complete example use case.

cc @candid pike

#
client.container(platform=dagger.Platform("linux/amd64")).build(...).
cursive lotus
#

@astral breach got that previous example updated 🙂

import sys
import anyio
import dagger

async def build():
  platforms = ["linux/amd64", "linux/arm64"]

  async with dagger.Connection(dagger.Config(log_output=sys.stderr)) as client:

    src = client.host().directory(".")

    variants = []
    for platform in platforms:
      alpine = (
        client.container(platform=dagger.Platform(platform))
        .from_(f"alpine")
        .with_directory("/src", src)
        .with_workdir("/src")
        .with_exec(["cat", "main.py"])
      )

      variants.append(alpine)

    await client.container().publish("jeremyatdockerhub/hello-python:latest", platform_variants=variants)
    print("All tasks have finished")

if __name__ == "__main__":
    anyio.run(build)
cursive lotus
#

So putting it all together...

"""Run tests for a single Python version."""

import sys
import anyio
import dagger
import os
async def docker_image_build():
  platforms = ["linux/amd64", "linux/arm64"]

  async with dagger.Connection(dagger.Config(log_output=sys.stderr)) as client:
    src = client.host().directory("./")

    variants = []    
    for platform in platforms:
      blog = (
          # build container for each platform
          client.container(platform=dagger.Platform(platform))
          .build(
              context = src,
              dockerfile = "Dockerfile",
              build_args=[
                dagger.BuildArg("PKG_NAME", os.environ.get("PKG_NAME", "default-value"))
              ]
          )
      )
      # save each platform variant in list
      variants.append(blog)

    # publish a multi-arch image using all the variants
    image = await client.container().publish("ttl.sh/test_image:1h", platform_variants=variants)

    print(f"Image is accessible at >>>>>>> {image}")


if __name__ == "__main__":
  anyio.run(docker_image_build)
astral breach
#

You are incredible ! Thanks

#

(sorry I didn't answer earlier, I was trying to get my code to work.)

cursive lotus
#

I fixed client.container(platform=dagger.Platform(platform)) line in script above ☝️ (had left that out of example), so make sure you have that so all the platform variants are built with the right arch and combined properly into a multi-arch image.