Happy New Year container monkeys! We are only three days in, so I think it’s still okay for me to say that. Today I’m going to share with you an easy, open source solution for sharing your containers using a Minio Server as our storage. Minio is an object storage akin to Amazon S3. The work that I’ll show you today will let you easily push Singularity containers to storage using the new endpoint for S3 added to Singularity Registry Client. Let’s get started!

Docker Compose All The Things

To get us a running start, I’ve created a docker-compose file to bring up a Minio Server and Singularity Registry Client with one command. The docker image is from Docker Hub and you should have docker-compose installed. We will bring up the image in detached (-d) mode. Fwoop!


wget https://raw.githubusercontent.com/singularityhub/sregistry-cli/master/examples/docker/docker-compose.yml
docker-compose up -d

Your images should be up and running when you issue docker ps, named minio and sregistrycli. If you go to 127.0.0.1:9000 you will see the Minio portal!

You can enter the testing username and password from the docker-compose file (minio and minio123) to log in to your storage portal.

Shell Inside

But first, let’s put some containers there! An empty storage portal is like a microwave without your pizza in it. Why would you want to open it? Here is how to shell in and pull a Docker image.


$ docker exec -it sregistrycli bash
(base) root@c512453bfeed:/code# 

Is it hot in here? Oh right, we are making container pizza!

Pull from Docker

Pull an image from Docker, we will push this image to our local registry!


SREGISTRY_CLIENT=docker sregistry pull ubuntu:latest

Push to Minio

The minio and aws credentials for the attached minio server are already exported with the container, as is the bucket name. S3 is also export as the default client. Let’s now use the client to push the image to the minio endpoint.


sregistry push --name test/ubuntu:latest /root/.singularity/shub/library-ubuntu-latest-latest.simg
Created bucket mybucket
[client|s3] [database|sqlite:////root/.singularity/sregistry.db]
[bucket:s3://s3.Bucket(name='mybucket')]

That’s it! Let’s check out the interface to see our little container:

You can also search for him on the command line:


(base) root@8f0234f80aa2:/code# sregistry search
[client|s3] [database|sqlite:////root/.singularity/sregistry.db]
[bucket:s3://s3.Bucket(name='mybucket')]
Containers
1  test/ubuntu:latest.simg	1-3-2019	

or pull him again!


(base) root@8f0234f80aa2:/code# sregistry pull test/ubuntu:latest.simg
[client|s3] [database|sqlite:////root/.singularity/sregistry.db]
[bucket:s3://s3.Bucket(name='mybucket')]
[container][new] test/ubuntu-latest
Success! /root/.singularity/shub/test-ubuntu-latest.simg

And yes, this means that if you actually deploy the Minio server, you can share your containers with your collaborators. This is good.

An Actual Deployment

If you want to deploy this for reals you can still use the docker-compose file, but you must change the access and secret key. These guys:

...
      environment:                         (------- minio
        MINIO_ACCESS_KEY: minio
        MINIO_SECRET_KEY: minio123
...
        AWS_ACCESS_KEY_ID: minio           (------- sregistrycli
        AWS_SECRET_ACCESS_KEY: minio123

The two sets of environment variables, the top for the minio container, and the bottom for the sregistry-cli container, should match. You also should check out the more detailed documentation to learn how to customize the storage endpoint or set this up locally. While you’re there, please admire the Minio bird:

So elegant and adorable, at the same time! If you have any questions, issues, dilemas, doubts, problems, stories, or riddles, please post an issue and I’ll do my best to help.