Docker Tip #48: List All Changes Performed in a Container
So, you've been making changes inside of a container and now you want to see how it differs from the original. Here's how.
As you probably know, containers are idempotent, meaning if you make a change to a running container, those changes will be lost the next time you start the container.
If you’re just fooling around inside of a container and planning out what you would eventually add to a
Dockerfile, you may want to get a list of what you changed.
For that, you can run the
docker container diff <container> command. Here’s let’s go over a real example so you can see how it works.
Starting up and making changes to an Alpine container:
# Start up a new container and run 3 commands inside of the container: docker run --rm -it --name difftest alpine:3.7 > mkdir exampledir > cd /tmp > touch hello.txt # [Open a second terminal window] # Take a look at what changed in the container: docker container diff difftest > A /exampledir > C /root > A /root/.ash_history > C /tmp > A /tmp/hello.txt
Docker has 3 symbols for identifying changes in its diff output:
- A: A file or directory was created
- C: A file or directory was changed
- D: A file or directory was deleted
In our example we didn’t delete anything, but you can see a few cases of A and C being used. As for the
.ash_histroy, that’s just a standard shell history file.
How does this differ from looking at the shell’s history?
diff command only includes the results of what was created, updated or deleted.
For example, you could run
docker exec difftest cat /root/.ash_history to get the history of the container, and you would get a full list of the exact commands we ran in the container, including
Consider both commands to be tools at your disposal for different use cases.
I find the
diff command easier to skim for changes and for creating a timeline of changes. The shell history is good for looking up exactly what you ran to produce those results.