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

Squashing from layer n to m? #165

Open
moritzp opened this issue Mar 18, 2018 · 3 comments
Open

Squashing from layer n to m? #165

moritzp opened this issue Mar 18, 2018 · 3 comments

Comments

@moritzp
Copy link

moritzp commented Mar 18, 2018

Hello,
I recently saw some projects using relatively large base images, such as wnameless/oracle-xe-11g, adding additional layers, e.g. by inserting test-data or some specific configuration. As they are frequently used to run tests in CI environments or as local development environments reflecting a production-closer setup, they are committed to some registry. In these cases using docker-squash compresses everything nicely into one layer but creates one huge layer that needs to be pushed to and pulled from the registry, even if only a small configuration was changed in layer X (X>1). In situations like this, it could make sense to squash only from layer n to m and thereby avoid the download of a layer containing the base image over and over again, even though that one didn't change.
Cheers,
Moritz

@richard-scott
Copy link

Isn't that what the "--from-layer" arg is for?

@moritzp
Copy link
Author

moritzp commented Mar 18, 2018

No. The --from-layer argument defines from which layer you squash down into the very first one, you can also see that in the example. My point is the following (using the data from the example):

$ docker history jboss/wildfly:latest
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
25954e6d2300        3 weeks ago         /bin/sh -c #(nop) CMD ["/opt/jboss/wildfly/bi   0 B
5ae69cb454a5        3 weeks ago         /bin/sh -c #(nop) EXPOSE 8080/tcp               0 B
dc24712f35c4        3 weeks ago         /bin/sh -c #(nop) ENV LAUNCH_JBOSS_IN_BACKGRO   0 B
d929129d4c8e        3 weeks ago         /bin/sh -c cd $HOME     && curl -O https://do   160.8 MB
b8fa3caf7d6d        3 weeks ago         /bin/sh -c #(nop) ENV JBOSS_HOME=/opt/jboss/w   0 B
38b8f85e74bf        3 weeks ago         /bin/sh -c #(nop) ENV WILDFLY_SHA1=c0dd7552c5   0 B
ae79b646b9a9        3 weeks ago         /bin/sh -c #(nop) ENV WILDFLY_VERSION=10.0.0.   0 B
2b4606dc9dc7        3 weeks ago         /bin/sh -c #(nop) ENV JAVA_HOME=/usr/lib/jvm/   0 B
118fa9e33576        3 weeks ago         /bin/sh -c #(nop) USER [jboss]                  0 B
5f7e8f36c3bb        3 weeks ago         /bin/sh -c yum -y install java-1.8.0-openjdk-   197.4 MB
3d4d0228f161        3 weeks ago         /bin/sh -c #(nop) USER [root]                   0 B
f7ab4ea19708        3 weeks ago         /bin/sh -c #(nop) MAINTAINER Marek Goldmann <   0 B

And now saying I want to squash from 5ae69cb454a5 to 118fa9e33576:

$ docker-squash --from-layer 5ae69cb454a5 --to-layer 118fa9e33576 -t jboss/wildfly:squashed jboss/wildfly:latest

The result would be something like the following:

$ docker history jboss/wildfly:squashed
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
25954e6d2300        3 weeks ago         /bin/sh -c #(nop) CMD ["/opt/jboss/wildfly/bi   0 B
fde7edd2e568        32 seconds ago                                                      358.2 MB
5f7e8f36c3bb        3 weeks ago         /bin/sh -c yum -y install java-1.8.0-openjdk-   197.4 MB
3d4d0228f161        3 weeks ago         /bin/sh -c #(nop) USER [root]                   0 B
f7ab4ea19708        3 weeks ago         /bin/sh -c #(nop) MAINTAINER Marek Goldmann <   0 B

As you can see, the very first layer 25954e6d2300 is kept, then some layers are squashed into fde7edd2e568, while all layers afterwards are kept as well.

@goldmann
Copy link
Owner

This is the type of feature it was not covered originally. The idea was that images are structured by Dockerfile and you squash content in a particular Dockerfile. If there is need for a behavior as described - I'm happy to review the contribution!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants