Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker: Reverse Engineering of an Image

Tags:

When we use Docker it's very easy push and pull image in a public repository in our https://hub.docker.com but this repository it's free only for public image(only one can be private).

Currently it's possible to execute a reverse engineering of a public image in repository and read the source code of project ?

like image 729
daniele3004 Avatar asked Jan 12 '18 14:01

daniele3004


People also ask

Can I reverse engineer a docker image?

In order to help reverse engineer this image into a Dockerfile, we will need to parse everything and reformat it into a form that is readable. Please note that for the purposes of this article, the following Python 3 code has been made available and can be obtained from the Dedockify repository on GitHub.

Can I get the Dockerfile from an image?

Whatever the reason, if you wish to recover a Dockerfile from an image, there are options. Docker images aren't a black box. Often, you can retrieve most of the information you need to reconstruct a Dockerfile.

What is a layer tar?

A Docker image is a tar archive that contains a top level repositories files, and then a number of layers stored as directories containing a json file with some metadata about the layer and a tar file named layer.tar with the layer content.

Can we untar a docker image?

If you want to get the image on your other machine and don't want to build it again then the ideal way is push the docker image created on your Ubuntu server to docker hub repository. Then you can simply do the docker pull to pull the image at any machine.

Can dedockify be used to reverse engineer a dockerfile?

With some additional changes to the recovered Dockerfile syntax, Dedockify can potentially be updated to completely automate the reverse engineering of a Docker image into a functional Dockerfile in most cases.

How to generate a dockerfile for an image that doesn't exist?

Note that the script only works against images that exist in your local image repository (the stuff you see when you type docker images). If you want to generate a Dockerfile for an image that doesn't exist in your local repo you'll first need to docker pull it.

How do I use the dive tool in Docker?

The Dive tool examines each layer of a Docker image. Let’s create a simple, easy-to-follow Dockerfile that we can use for testing. By entering the above and pressing enter, we’ve just created a new Dockerfile and populated three zero-byte test files in the same directory.

Why should I update my dockerfile program?

Also, the program can be updated to be able to automatically recover files from the container and store them locally, while also automatically making appropriate updates to the Dockerfile. Finally, the program can also be updated to be able to easily infer if the base layer is using an empty scratch image, or something else.


2 Answers

You can check how an image was created using docker history <image-name> --no-trunc

Update:

Check dive which is a very nice tool that allows you to views image layers.

like image 127
yamenk Avatar answered Oct 11 '22 13:10

yamenk


As yamenk said docker history is the key to this.

As https://github.com/CenturyLinkLabs/dockerfile-from-image is broken, you can use recent

https://hub.docker.com/r/dduvnjak/dockerfile-from-image/

Extract from the site

Note that the script only works against images that exist in your local image repository (the stuff you see when you type docker images). If you want to generate a Dockerfile for an image that doesn't exist in your local repo you'll first need to docker pull it.

For example, you can run it agains itself, to see the code

$ docker run --rm -v /run/docker.sock:/run/docker.sock centurylink/dockerfile-from-image ruby FROM buildpack-deps:latest RUN useradd -g users user RUN apt-get update && apt-get install -y bison procps RUN apt-get update && apt-get install -y ruby ADD dir:03090a5fdc5feb8b4f1d6a69214c37b5f6d653f5185cddb6bf7fd71e6ded561c in /usr/src/ruby WORKDIR /usr/src/ruby RUN chown -R user:users . USER user RUN autoconf && ./configure --disable-install-doc RUN make -j"$(nproc)" RUN make check USER root RUN apt-get purge -y ruby RUN make install RUN echo 'gem: --no-rdoc --no-ri' >> /.gemrc RUN gem install bundler ONBUILD ADD . /usr/src/app ONBUILD WORKDIR /usr/src/app ONBUILD RUN [ ! -e Gemfile ] || bundle install --system 
like image 41
user2915097 Avatar answered Oct 11 '22 11:10

user2915097