How to list files in a stopped Docker container
DockerDocker Problem Overview
This question shows how to copy files out of a stopped container. This requires that I know the full path to the file including its file name. I know the directory I want to copy a file out of, but I do not know its file name since that is generated dynamically. How do I list the files in a directory in a stopped Docker container?
The following Docker command works great if the Docker container is running. But, it fails if the Docker container is stopped.
docker exec --privileged MyContainer ls -1 /var/log
Note: The files are not stored in a persistent volume.
Docker Solutions
Solution 1 - Docker
This answer to another question shows how to start a stopped container with another command. Here are the commands to list files in a stopped container.
- Commit the stopped container to a new image:
test_image
.docker commit $CONTAINER_ID test_image
- Run the new image in a new container with a shell.
docker run -ti --entrypoint=sh test_image
- Run the list file command in the new container.
docker exec --privileged $NEW_CONTAINER_ID ls -1 /var/log
Solution 2 - Docker
When starting the container is not an option, you can always export your image (a bit overkill but..) and list its contents:
docker export -o dump.tar <container id>
tar -tvf dump.tar
Reference: Baeldung - Exploring a Docker Container’s Filesystem
Solution 3 - Docker
The command docker diff *CONTAINER*
will list the files added, deleted and changed since the Container started.
If a file did not change since the container was started, then you would have to know the contents of the original image that started the container. So, this answer is not ideal but avoids creating an image and running it.
Unlike container-diff
, this command does not require first creating a Docker image.
Solution 4 - Docker
If you want to see a certain file content, I would suggest using docker container cp
command. Here is the doc. It works on stopped container. Example:
docker container cp 02b1ef7de80a:/etc/nginx/conf.d/default.conf ./
This way I got the config file that was generated by templating engine during start.
Solution 5 - Docker
Try using container-diff
with the --type=file
option. This will compare two images and report the files added, deleted and modified.
If a file did not change since the container was started, then you would have to know the contents of the original image that started the container. So, this answer is not ideal but avoids creating an image and running it.
This tool requires that you first create an image of the stopped Docker container with docker commit
.
Here is the command to install it:
curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64 \
&& chmod +x container-diff-linux-amd64 \
&& mkdir -p $HOME/bin \
&& export PATH=$PATH:$HOME/bin \
&& mv container-diff-linux-amd64 $HOME/bin/container-diff
Here is the command to use the utility:
container-diff analyze $IMAGE --type=file
Solution 6 - Docker
docker container cp <STOPPED_CONTAINER_ID>:<PATH_TO_FILE> -
Notice the "-" at the end of the command.
It actually "copies" the specified file from the stopped container into "stdout". In other words, it just prints the file contents.
Thanks @azat-khadiev for your direction (I don't know why you got "-1 for that answer...)