我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。

理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。


当前回答

在新版本的Docker上,你可以运行Docker exec [container_name],它在你的容器中运行一个shell

因此,要获得容器中所有文件的列表,只需运行docker exec [container_name] ls

其他回答

创建容器之前:

如果你想探索图像的结构,即安装在容器内,你可以这样做

sudo docker image save image_name > image.tar
tar -xvf image.tar

这将使您可以看到图像的所有层及其json文件中的配置。

创建容器后:

对于这个问题,上面已经有很多答案了。我喜欢的方式 这将是

docker exec -t -i container /bin/bash

容器的文件系统在docker的data文件夹中,通常在/var/lib/docker。要启动并检查正在运行的容器文件系统,请执行以下操作:

hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash

现在,当前的工作目录是容器的根目录。

通常情况下,我只需要探索docker文件系统,因为我的构建不会运行,所以docker run -it <container_name> bash是不切实际的。我也不想浪费时间和内存复制文件系统,所以docker cp <container_name>:<path> <target_path>也是不切实际的。

虽然可能不太正统,但我建议在Dockerfile中使用ls作为最后的命令重新构建:

CMD [ "ls", "-R" ]

您可以使用dive与TUI交互查看图像内容

https://github.com/wagoodman/dive

投票最多的答案是好的,除非你的容器不是一个真正的Linux系统。

许多容器(特别是基于go的容器)没有任何标准二进制文件(没有/bin/bash或/bin/sh)。在这种情况下,你需要直接访问实际的容器文件:

效果非常好:

name=<name>
dockerId=$(docker inspect -f {{.Id}} $name)
mountId=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$dockerId/mount-id)
cd /var/lib/docker/aufs/mnt/$mountId

注意:您需要以root用户运行它。