nix2container icon indicating copy to clipboard operation
nix2container copied to clipboard

Weirdness with fromImage

Open angerman opened this issue 1 year ago • 8 comments

I'm trying to use nix2container to build a google cloudshell container, and I'm running into multiple issues :D

My basic configuration looks something like this:

nix2containerPkgs.nix2container.buildImage {
      name = "gcr.io/myproject/mycloudshell";
      tag = "latest";
      fromImage = nix2containerPkgs.nix2container.pullImage {
        imageName = "gcr.io/cloudshell-images/cloudshell";
        imageDigest = "sha256:68f5f1a01574bd795192098d676ac4150610ab89d4c0c23e72f9a0f7ec2cf1db";
        sha256 = "sha256-i++Camqmzugr3aq56UvGujuFqDo8Cj6gD9IY/a/0HpI=";
      };
      maxLayers = 200;
       config.env = [
         "DEBIAN_FRONTEND=noninteractive"
         "PATH=/opt/gradle/bin:/opt/maven/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin:/usr/local/nvm/versions/node/v16.4.0/bin:/usr/local/rvm/bin:/google/go_appengine:/google/google_appengine"
         "PORT=8080"
         "CLOUD_SDK=/usr/lib/google-cloud-sdk"
         "GCLOUD_CONTAINER_SERVER=gcr.io"
         "LOG=file"
         "DOCKER_HOST=unix:///var/run/docker.sock"
         "NODEJS_VERSION=16.4.0"
         "DEVSHELL_CLIENTS_DIR=/var/run/google/devshell"
         "CREDENTIALS_SERVICE_PORT=8998"
         "KUBECTX_VERSION=0.9.4"
      ];
      config.entrypoint = [
            "/bin/bash"
            "/google/scripts/onrun.sh"
      ];
      config.volumes."/var/lib/docker" = {};
    };
  };

funnily enough, despite it being public (as per gcr), cloud shell complains it can't find the image.

If I on the other hand construct an empty image (using google base image), and google cloud shell's guide (which uses docker I believe), I get a working image. If I then use google cloud shell's guild but use my image (produced as above) as a base image, google cloud shell can find it, but fails to load it.

What I've found so far is that the date tags are different (of couse, nix is at unix:0), but a bit more unexpected is that the layer hashes are all different in both images. E.g. using skopeo inspect the layers all have different hashes; and the nix2container one also misses all the history items, though I doubt that's much of an issue.

The nix2container generated one also doesn't set the

    "Created": "2022-06-04T08:28:10.227221947Z",
    "DockerVersion": "18.09.0",

values. And gcr also seems to be unable to compute the size of the image.

angerman avatar Aug 29 '22 03:08 angerman

Just to add one more data point. These are the layers as per skopeo inspect from the google cloud shell base image:

    "Layers": [
        "sha256:cbfe985b5bc1d578be10f1863a87a997158bf3c8cddcbf1f25d049ad210fa20b",
        "sha256:2e1bfe63320ec22cf000ba264ac09c48c11a37a1c175a50f6fd314fc9862bd40",
        "sha256:44b9aba2766a5ce891f7f9d8a076a48a71fda78a724c58dbc70567088b749d2e",
        "sha256:30d7158c02dba942c61186106c2b07adf8177d4c3da51e744c82e7ece10aecac",
        "sha256:a4660d663c916d350500fb560e63349193afb4a0c71981870add3c69db0d9154",
        "sha256:02d0a80b7a6c4da4811e837699ac6d34b2e2df73fd55b174d7862b761a5b1bb5",
        "sha256:4a2a4979208f301ac3aefd6c351283e3e002073ae14357c9c10f0ad125fca5e9",
        "sha256:f0ade090fd3bc2d5595688a7fceba981eaa7f9b8e26b11251f3f3c59cfd5a5bb",
        "sha256:ee3a4015a1c87e4cc149840fc37dbcfad6cb0aeb5738c7ccbb45e55a69510155",
        "sha256:229ba37d5e054db1ba603758da24195c60fa26c4448aa1314bc021556e594f38",
        "sha256:8ce61e8947f8ed95072cfff242e9c6cacb4c12039ee87d460e0b5908056878f3",
        "sha256:711c2c23758805806af0281c3087d644677af6d7218f1d111ebf2eaf8c820de9",
        "sha256:b6a2942accd0adb9390d8ab1ea0a7b3989b37b5c1464cec346621e33ef5f10e7",
        "sha256:cfc807cad85c1a0fa5fa956f24ed43438af64d6944ce012bac6728785f305495",
        "sha256:69d836b6052b333d2048dff7ad7768c81414433daf31ad9862d1fa930c852d1c",
        "sha256:4dd20947788ef751552bf6b7f73870ba93abeff4709ed52c7f7d540184dc79a6",
        "sha256:1dc037f9de2997b14c5d85db4c634f212b37763ee589578546b5c4a9c1e94c37",
        "sha256:30299f0351dc10afda18f4cbc0b50d2e27ccdfb9c9662aa3b03e2a93ff80917e",
        "sha256:d0584d305ec0f87c7561d8fbc37f1a363714db647e12ab70dc78b71f0c2e88a7",
        "sha256:3cae59815d2f3788d73d788281d9c2596fb62cb46d6de625e61fcafc29e31ba8",
        "sha256:6517927bd44d909afbf995499371afedfb9c517a195c9624acf2f849cd21d9a7",
        "sha256:22d2856e84b368d2fa4441ada9b651c71f3ef8fa5b0bed8fcdefbc427aa73e95",
        "sha256:8f4d8937bfcce7ddad35dd61b9c457e4fc06190a704004526041bc033b1b0cdb",
        "sha256:aad151415fce55820e23036edcac6535f6f6610659dea7a00a4ee8efb4c01855",
        "sha256:da71c8d20604ce83c8f6e0532e38c0102c6d8ffaac21838b07800108116a1eff",
        "sha256:1555eef99f5ce3682b81d94b027399a3b1e2e23a27e2be5fce9dea8a88e53ce1",
        "sha256:1aac2ba2c5336021a0e950bcff3c32907c18397429b6e3f5b600ed2931fe33af",
        "sha256:8e70e1080403a98dcd2ab2e0d0951678277224c3ea30aa25c27e51f25c616629",
        "sha256:6911edd37e129bfde0649a68b3d0ea25b655e929b78712bf49fb3fd26439ab5d",
        "sha256:17e37c11c14ce30a5ee9844b22356e4c45a75680d31b28c18d2ed0046499c236",
        "sha256:ea7454e65f75cade485d5e091ab3442f35897807e7badd0f10cce7b5575db8aa",
        "sha256:a5e6d61a09fb3a9cfd57b707f4f5ce5a132cf898f472d757eb28119c531f3f6b",
        "sha256:b5f2647e56dc091f98ed0d45f2d497a1939adab00bf633af12bcf1c8dc006c9d",
        "sha256:5f02ee1bbe107fa3b185b1f5995ce96152acbd03ea44de91bc7221911d0502f7",
        "sha256:7bb076c8a942e5586b3d6c54fb165e32ed5de8e7c9bfaa3184e2f3b89affe254",
        "sha256:d94c2f224d1e0e631b94f4a546c320b5cb9959b98596dc0869d5a5205d52f539",
        "sha256:8627a44593f61f156035617cf550385a0866b4444629aa81a5b3bd0af14225a1",
        "sha256:6b2bc5feff35d23ae621ec1a9be95c796176e293251ff0bc4501f5d39878e03e",
        "sha256:23abaf492dd55c2c5eb3d3d1327fc2305fa09bd98b49799ae569d997ee2cd1eb",
        "sha256:0b37de2b4799d9c448d68e13651f2ef8c159905bb1c2e05ff6d6cd9d132aa136",
        "sha256:fb70e78d873963812c353543e1f8f8f761ba4ace5434f981c8c94d57fee7eb49",
        "sha256:00cbbc267eb550345ed678076bbc74077e2a4aa8abbde79fbee2eab48803d137",
        "sha256:8b787773e095a506177d368f4b8215db36718efe582d074652f6b1cc703cd7eb",
        "sha256:38715226797fb1b163dba46146011cb9b25e285321e0ef6942cf36938e42f8a1",
        "sha256:c50f7beee5bd62f7c205a697b3d64fc4d62db9bc9c5d18ee969928c15d4549c5",
        "sha256:1b9f09264803f578d7f3b536def652fae8312e31a19f91a2763277e16310c28b",
        "sha256:678b73e1b27f2fd3cd576351647a7b15382cbce347b309fd7c79a683f794efa0",
        "sha256:344e77f959ab2d1455e48c7fbc27e90ef57e61b99c1cb412ec05aef2ecb6eb26",
        "sha256:1f4cd7532416ad6194b5e020022c85c5102a5f6316a9315dd15fe80e85b55784",
        "sha256:3d0633dfa42cf6ea38ea6a80ee1177343df959885a6d19c61daf399b75a57aca",
        "sha256:3e161ddddadb4bd3179a10eaca99c3197796c90379952ad533e5eea9ecb190da",
        "sha256:529ef8164f99c69088c4e0a89870a2f6e782da9a1580b6e7de4a682d7b8f95ec",
        "sha256:2bef818babd647857c813094919ca259190a1d2c5b76c073b1ccd4ed14a13ce0",
        "sha256:82010eaa38a47a38da295d8eae223adc404b9013d6ef739494c835907fc93b20",
        "sha256:adab4b4d456fa3a02fbea108ad872350f9cc808935c532c6f73a8194a23771ef",
        "sha256:1e2b3300133ae348852843ef603d27262866bd9459f5dc30d278f52af35df588",
        "sha256:f1717085bf6d3bcb5154b2efde5ef34bf88953808ff811fa4df9829e9915c918",
        "sha256:16b78615f63b0d9c335288d21ed1611e967cc565dc07fe9010427449abfee4eb",
        "sha256:8cf8ea3d9531589f7d7f5a6f7e1e73ceddf2b0e7c4392eed19f40a6ce410a287",
        "sha256:6eb4931daf09d9805ea9b37ce7b0cda33f899c26390de3fc8c69fa6d60a742ba",
        "sha256:44527add0de9459f6e826b8279322562115c05a9d30764bb7a8b42eeb239181f",
        "sha256:e4c281e085f694be75acfbfac2b50c4b6559cb597d1a3d97d143a39d3e6c2619",
        "sha256:b015a3602a5ac72ca5b40df994c39bfe8226be001c33e94fa7c5820a40ee801f",
        "sha256:e6980abefcf4a6c44d6ca04cc6ff629f27d9d084642865be93a59b6ab6920657",
        "sha256:17023050039169d79984a18b205621ddbd4a1a7af491d2e5b6c532d0a5f4021f",
        "sha256:705edd1c71a128d007d80bedfb490dfb1c48fa210e19d5c0cf51519b6f882893",
        "sha256:9498029c89e5c044d30d4f5a4a2bd9937257800d5a8fde8b629c1aec43253ec2",
        "sha256:7d772b43c7a0796c8416f7bfac64b19dd4283e7b49018a0ad925c6d2c339b9dd",
        "sha256:dc49ec09232211768ed37ab1d8ccd14b380ecb7fc03917917e3d928ae7007ae5",
        "sha256:bbe7ab2778a5bc26228958320e5b0f84580de55726e393b975a8b9b5e4a0c62d",
        "sha256:e6a331b0bf52e609a456de0e0e3f9f48f8dc14c17759573aef321dc44eaa8b04",
        "sha256:dc696c45a9998ba3b27436689073060d9dde914959bdc47c3032bd690e1319c0",
        "sha256:7b2a2ce14e5ba3936ef7cfbc841731cfa3549a998eb8207dc928b465dbc2be9d",
        "sha256:caf8901d1ca869999ea093816709955e7eb73a49830052309d08362d0f819d03"
    ],

the nix2container-gcr.io-cloushell-images-cloudshell.json looks like this:

{
        "image-config": {},
        "layers": [
                {
                        "digest": "sha256:cbfe985b5bc1d578be10f1863a87a997158bf3c8cddcbf1f25d049ad210fa20b",
                        "size": 0,
                        "diff_ids": "sha256:3fe0c8c55320679dedec17005c5cbc920ebff509f8cd232752e8a8bdb59fe3a5",
                        "mediatype": "application/vnd.oci.image.layer.v1.tar+gzip",
                        "layer-path": "/nix/store/izrfqs2j0qfswrcg0nl7xb4gn18zz9wg-docker-image-gcr.io-cloudshell-images-cloudshell/cbfe985b5bc1d578be10f1863a87a997158bf3c8cddcbf1f25d049ad210fa20b"
                },
                {
                        "digest": "sha256:2e1bfe63320ec22cf000ba264ac09c48c11a37a1c175a50f6fd314fc9862bd40",
                        "size": 0,
                        "diff_ids": "sha256:fbf6cc502eb6bb2f67f0d3ffefcc0551630ff8a2b8116d22f4eea3e7e8e09d3c",
                        "mediatype": "application/vnd.oci.image.layer.v1.tar+gzip",
                        "layer-path": "/nix/store/izrfqs2j0qfswrcg0nl7xb4gn18zz9wg-docker-image-gcr.io-cloudshell-images-cloudshell/2e1bfe63320ec22cf000ba264ac09c48c11a37a1c175a50f6fd314fc9862bd40"
                },
                {
                        "digest": "sha256:44b9aba2766a5ce891f7f9d8a076a48a71fda78a724c58dbc70567088b749d2e",
                        "size": 0,
                        "diff_ids": "sha256:dc4a79ee54526ccef7f437682237373397c0db126a4789dc40db9a4261f2e7d1",
                        "mediatype": "application/vnd.oci.image.layer.v1.tar+gzip",
                        "layer-path": "/nix/store/izrfqs2j0qfswrcg0nl7xb4gn18zz9wg-docker-image-gcr.io-cloudshell-images-cloudshell/44b9aba2766a5ce891f7f9d8a076a48a71fda78a724c58dbc70567088b749d2e"
                },
                ...

notabley the size apears always as 0.

angerman avatar Aug 29 '22 03:08 angerman

When i built your image, the resulting image contains 74 layers:

more /nix/store/b7qc6y2q4fx93qgbv2z82nc3rfkzhgj8-image-mycloudshell.json | grep digest | wc -l
74

which is the same number than the upstream image:

nix run nixpkgs#skopeo -- inspect  docker://gcr.io/cloudshell-images/cloudshell | jq .Layers | grep sha256 | wc -l
74

The size should not be 0 but it's not really important since it is only used to display the progress bar when pushing the image to a registry.

I actually don't really understand your issues. Could you please provide an example which fails at some point?

btw, i'm wondering what this image contains ;)

du -hs /nix/store/izrfqs2j0qfswrcg0nl7xb4gn18zz9wg-docker-image-gcr.io-cloudshell-images-cloudshell
7.5G	/nix/store/izrfqs2j0qfswrcg0nl7xb4gn18zz9wg-docker-image-gcr.io-cloudshell-images-cloudshell

nlewo avatar Aug 29 '22 20:08 nlewo

@nlewo alright, sure. So, google provides (as part of their suite of tools) a cloud IDE (similar to e.g. gitpod, github codespaces, ...). This basically launches the cloudhshell image on their infrastructure, and provides you an IDE ontop (they use Theia iirc).

Now of course you'd want

  • (a) some nix in that image (because, why not, and maybe you'd like to query some nix store...)
  • (b) effecitvely a copy of your nix-shell in there as well, so that you have all the tools needed to work.

and they do allow custom images (but they must start from their official coudshell image). The documentation is here: https://cloud.google.com/shell/docs/customizing-container-image, and if you click the guide me link it takes you into a cloud shell to create a custom image (a bit meta, I know).

Once that image is built you can then launch a shell in googles cloud services with a link like this:

https://ssh.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https://github.com/nlewo/nix2container&cloudshell_image=gcr.io/project-id/docker-image-name

To push an image to with nix2container to gcr (google container registry), one needs to get some credentials, which can be obtained from using gcloud auth print-access-token in the cloud shell. And then using the skopeo login method, with username oauth2accesstoken, and the token for the password.

However, creating any such image with nix2container (even a bare one), fails to load when opened via the above link.

I have create both images here: https://console.cloud.google.com/gcr/images/spatial-ship-359809

As such

https://ssh.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https://github.com/nlewo/nix2container&cloudshell_image=gcr.io/spatial-ship-359809/mycloudshell-gog

should launch an editor for this repository using the google created image (basically a docker file with only a FROM line)

and

https://ssh.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https://github.com/nlewo/nix2container&cloudshell_image=gcr.io/spatial-ship-359809/mycloudshell-nix

should launch an editor for this repository using the nix2container created image.

angerman avatar Aug 30 '22 01:08 angerman

And while the fist link works (opens a cloud shell for this repository), the second one fails with an ominous:

The image requested is either private or does not exist. Cloud Shell does not support temporary environments with private images.

which makes little sense.

Now, if we then go and use the nix2container generated image as a base for the docker file:

FROM gcr.io/spatial-ship-359809/mycloudshell-nix:latest

and build that image. Push it to the gcr, and try to use it (https://ssh.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https://github.com/nlewo/nix2container&cloudshell_image=gcr.io/spatial-ship-359809/mycloudshell-nix-gog), we instead get this lovely error:

Cloud Shell is experiencing some issues provisioning a VM to you. Please try again in a few minutes.

which won't go away, even after hours.

Hence, something with the generated images is quite perplexing:

  • gcr.io/spatial-ship-359809/mycloudshell-gog:latest -- works
  • gcr.io/spatial-ship-359809/mycloudshell-nix:latest -- fails to be found 😕
  • gcr.io/spatial-ship-359809/mycloudshell-nix-gog:latest -- is found, but fails to launch.

hence my (rather unsuccessful) quest so far to figure out what exactly is different among them.

angerman avatar Aug 30 '22 02:08 angerman

@blaggacao I'm afraid that has no effect :-/

angerman avatar Aug 30 '22 04:08 angerman

@angerman have you tired using buildImage from nixpkgs?

adrian-gierakowski avatar Aug 30 '22 07:08 adrian-gierakowski

As suggested by @adrian-gierakowski it would be nice to try with nixpkgs.dockerTools.buildImage: these functions are much more robust than nix2container ones (which are younger).

nlewo avatar Aug 30 '22 08:08 nlewo

To isolate the problem I’d build with dockertools.buildImage first and push with standard docker client. If that works then build another image but push with skopeo. If that works the try dockerTools.streamLayeredImage. Then we could try to compare what’s different between the images which worked and the ones which didn’t and what dockertools does differently to nix2container

adrian-gierakowski avatar Aug 30 '22 12:08 adrian-gierakowski