Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kaniko recursion error while building docker image #2210

Closed
llacroix opened this issue Aug 16, 2022 · 9 comments
Closed

Kaniko recursion error while building docker image #2210

llacroix opened this issue Aug 16, 2022 · 9 comments
Labels
area/filesystems For all bugs related to kaniko container filesystems (mounting issues etc) feat/concurrency issue/kaniko-build-kaniko issue/kaniko-dir kind/bug Something isn't working ok-to-close? possible-dupe priority/p1 Basic need feature compatibility with docker build. we should be working on this next.

Comments

@llacroix
Copy link

llacroix commented Aug 16, 2022

Actual behavior
It cannot build an image with multi-stage from kaniko itself.

Expected behavior
It should just build

To Reproduce

docker run -it -v `pwd`:/project gcr.io/kaniko-project/executor:latest -f /project/Dockerfile --no-push

Additional Information

Dockerfile:

from gcr.io/kaniko-project/executor:latest as kaniko
from ubuntu:22.04

copy --from=kaniko /kaniko /kaniko                                                                                           

RUN apt-get update && \
    apt-get install -y ca-certificates

cmd ["/bin/bash"]
INFO[0002] Saving file kaniko for later use 
 error.
error building image: could not save file: copying file: stat /kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/0/kaniko/.docker: file name too long

That said, this docker image does work:

from gcr.io/kaniko-project/executor:latest as kaniko
from ubuntu:22.04

copy --from=kaniko /kaniko /kanikos                                                                                          

RUN apt-get update && \
    apt-get install -y ca-certificates

cmd ["/bin/bash"]

But in order to make it work, you have to create the /kaniko directory yourself first before every build
Then you have to set the KANIKO_DIR environment variable to something different than /kaniko. The --kaniko-dir shouldn't be defined or it should be set to the same thing as KANIKO_DIR. Which is rather strange... When the command starts, it attempt to use /kaniko regardless... that's why you have to create the directory first as when kaniko-dir is defined it will not attempt to create the folder... Then when it's done, it destroys the /kaniko directory but the one defined in --kaniko-dir AND KANIKO_DIR remains.

When using --cleanup it deletes the /bin directory as seen here and /kan (KANIKO_DIR) is not empty.

root@a564a439faf3:/# echo *      
dev etc kan proc project sys tmp var

root@a564a439faf3:/# echo ./kan/*
./kan/0 ./kan/1235947557 ./kan/1296123851 ./kan/147312305 ./kan/2419480857 ./kan/Dockerfile

You can see here that if the kaniko path is different to /kaniko it will remove it. Which doesn't really make any sense. What this means is that the binaries in /kaniko gets moved to the new kaniko dir and Kaniko gets destroyed at the end. Since the default KanikoDir isn't there it will not be able to copy it initially.

// The destination directory may be across a different partition, so we cannot simply rename/move the directory in this case.
if _, err := util.CopyDir(constants.DefaultKanikoPath, dir, util.FileContext{}, util.DoNotChangeUID, util.DoNotChangeGID); err != nil {
return err
}
if err := os.RemoveAll(constants.DefaultKanikoPath); err != nil {
return err
}

@llacroix
Copy link
Author

It seems that cleanup removes all directory except those in dev etc proc sys tmp var and KANIKO_DIR and folders mounted as volumes. It's unclear to me why would kaniko destroy its own environment. If that's the case, it probably always worked like that but nobody knew because usually kaniko is runned once.

@llacroix
Copy link
Author

I think what I attempted to do is simply impossible with Kaniko because it contains itself a kaniko folder.

@orangeswim
Copy link

Also getting this issue

@llacroix
Copy link
Author

@orangeswim There's no way around it from what I understand.

Kaniko is designed this way to avoid using special capabilities by forcing the use of --privilege or --add-cap. Instead, Kaniko is designed to work by storing everything it needs in memory and some things in /kaniko.

Then Kaniko execute the docker file on its own file system and after each steps it makes a snapshot of the changes made to the filesystem. As a result any change made into the /kaniko folder doesn't work because /kaniko is reserved to Kaniko itself.

What this means is that you can't build kaniko with kaniko unless both the image running kaniko and the image you're building agrees on a folder to not touch.. I guess what can be done is to build a Kaniko image with docker to store/lookup files in /kaniko_real and build an image with this kaniko image that store things in /kaniko and then /kaniko_real would be used instead of /kaniko.

But it's simpler to just not use /kaniko instead or build the Kaniko image without Kaniko.

@waddles
Copy link

waddles commented Apr 13, 2023

So there's really no way to build any image containing kaniko with kaniko because the /kaniko/ path gets bind mounted into the build context? Yuck.

@ryandiamond23
Copy link

Has anybody figured out an easy way to work around this? Kinda stupid it can't build itself...

@llacroix
Copy link
Author

@ryandiamond23 haven't tried it, but you might be able to build kaniko to have its path in something else than /kaniko. Then you use that new kaniko to build it again but this time in /kaniko

@aaron-prindle aaron-prindle added issue/kaniko-build-kaniko feat/concurrency priority/p1 Basic need feature compatibility with docker build. we should be working on this next. kind/bug Something isn't working area/filesystems For all bugs related to kaniko container filesystems (mounting issues etc) possible-dupe ok-to-close? issue/kaniko-dir labels Jun 22, 2023
@aaron-prindle
Copy link
Collaborator

Related #1881

@aaron-prindle
Copy link
Collaborator

Fixed with #2863, closing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/filesystems For all bugs related to kaniko container filesystems (mounting issues etc) feat/concurrency issue/kaniko-build-kaniko issue/kaniko-dir kind/bug Something isn't working ok-to-close? possible-dupe priority/p1 Basic need feature compatibility with docker build. we should be working on this next.
Projects
None yet
Development

No branches or pull requests

5 participants