wave icon indicating copy to clipboard operation
wave copied to clipboard

Allow the use of S3 bucket to host container build assets

Open pditommaso opened this issue 1 year ago • 21 comments

Context

Currently, the build process relies on a shared file system (AWS EFS). In a nutshell, the process is the following:

  1. A unique work directory is created for a container build
  2. Container build assets are copied in the build work directory (e.g. Dockerfile, context files, etc)
  3. The work directory is mounted in the build container.
  4. The files read by Builkit.

Deliverable

The goal of this issue is to replace the use of the shared file system with an object storage e.g. S3 in order to:

  1. simplify the system dependencies
  2. simplify the installation process
  3. simplify the maintenance

Solution

This could be achieved:

  1. storing the build assets into a S3 bucket instead of EFS storage (preserving the same unique path creation logic)
  2. making accessible the S3 path in the container a local path via Fusion
  3. use the container /tmp as work directory required by Buildkit

pditommaso avatar Jul 17 '24 11:07 pditommaso

Adding @jordeu for visibility

pditommaso avatar Jul 17 '24 11:07 pditommaso

@munishchouhan We should make a POC simulating a build process pulling the data from S3 via Fusion using a local container

pditommaso avatar Jul 17 '24 11:07 pditommaso

I started working on this today with @pabloaledo, we found the couple of things:

  1. We need a custom buildkit image with fusion enabled
  2. Buildkit rootless is not working because fusion needs root access

build is still not working, but we can see in the builder container that s3 content has been mounted inside container

munishchouhan avatar Jul 18 '24 14:07 munishchouhan

I will keep on updating here for discussion

munishchouhan avatar Jul 18 '24 14:07 munishchouhan

  1. @pabloaledo is creating (or has created) a scratch container for Fusion. Having that you can make a create that image with wave -i moby/buildkit:v0.14.1-rootless --include <fusion scratch image> 😎
  2. Fusion does not require privileged execution. @jordeu may provide more details

pditommaso avatar Jul 18 '24 14:07 pditommaso

we created using wave --config-file <fusion config file URL> -i moby/buildkit:v0.15.0

munishchouhan avatar Jul 18 '24 14:07 munishchouhan

Same 👍

pditommaso avatar Jul 18 '24 15:07 pditommaso

Another point:

  1. buildkit uses its own entrypoint --entrypoint buildctl-daemonless.sh, which is overriding fusion entrypoint

munishchouhan avatar Jul 18 '24 21:07 munishchouhan

I am able to fix the entrypoint issue by creating a custom image with one entrypoint='' between buildkitd and fusion

munishchouhan avatar Jul 18 '24 22:07 munishchouhan

That happens because you are using --config-file approach

pditommaso avatar Jul 19 '24 07:07 pditommaso

build is working but push is failing because of the lack of config.json file Working on how to add config.json in container

munishchouhan avatar Jul 19 '24 13:07 munishchouhan

It is supposed to be in the bucket along with the Dockerfile

pditommaso avatar Jul 19 '24 13:07 pditommaso

It is supposed to be in the bucket along with the Dockerfile

yes, but it need to be mounted to /root/.docker folder

munishchouhan avatar Jul 19 '24 13:07 munishchouhan

Indeed, that's not simple to solve. Tagging @fntlnz, he may have some suggestion

pditommaso avatar Jul 19 '24 13:07 pditommaso

About the problem of mounting /root/.docker likely it's not possible because Fusion used its own opinionated path prefix. Maybe should consider instead using Mountpoint. @jordeu What do you think?

pditommaso avatar Jul 23 '24 08:07 pditommaso

Unfortunately even if fusion can change the mount dir with -mount-point flag it it has the second level directory which is the name of the remote storage (e.g: s3).

However it's easy to use a different directory for docker config so this works with fusion

sudo DOCKER_CONFIG=/fusion/s3/fusion-develop/scratch   docker build -t myimage .

here is how it looks like on s3.

image

So I would say, just mount fusion as it is and tell the docker cli to point to it.

fntlnz avatar Jul 23 '24 09:07 fntlnz

DOCKER_CONFIG sounds a good trick

pditommaso avatar Jul 23 '24 10:07 pditommaso

thanks @fntlnz DOCKER_CONFIG did the trick Working on code changes now

munishchouhan avatar Jul 24 '24 14:07 munishchouhan

This change also requires changes in Scan process and for singularity builds too. I have created draft PR with changes in build process and tested it too, it works with dockerfile

munishchouhan avatar Jul 24 '24 23:07 munishchouhan

Singularity build and push are working using docker Now i will work on scan

munishchouhan avatar Aug 13 '24 21:08 munishchouhan

Scan, SIngularity and build process with docker works with s3 now I will work to move k8s to s3 now

munishchouhan avatar Aug 22 '24 11:08 munishchouhan