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

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


当前回答

实际上我使用的所有容器都有Python,所以我附加到容器,

pip install jupyterlab
cd /
jupyter lab --allow-root

我^点击Jupyter Lab服务器提供的链接,在主机的浏览器中,我有完美的文件系统GUI,可以打开各种文件(ipnb, py, md(预览),…)

干杯 G。

其他回答

得到最多好评的答案是,当容器实际启动时,它为我工作,但当它不可能运行时,例如,你想从容器中复制文件,这之前已经保存了我:

docker cp <container-name>:<path/inside/container> <path/on/host/>

多亏了docker cp (link),你可以直接从容器中复制,就像它是文件系统的任何其他部分一样。 例如,恢复容器内的所有文件:

mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/

注意,您不需要指定要递归复制。

对我来说,这个工作得很好(感谢最后的注释指出目录/var/lib/docker/):

chroot /var/lib/docker/containers/2465790aa2c4*/root/

这里,2465790aa2c4是运行容器的短ID(由docker ps显示),后面跟着一个星号。

仅适用于LINUX

我使用的最简单的方法是使用proc dir,容器必须运行以检查docker容器文件。

找出容器的进程id (PID)并将其存储到某个变量中 PID=$(docker inspect -f '{{. state。Pid}} ' your-container-name-here) 确保容器进程正在运行,并使用变量名进入容器文件夹 cd /proc/$ PID /根

如果您想在不找到PID编号的情况下访问dir,只需使用这个长命令

cd /proc/$(docker inspect -f '{{.State.Pid}}' your-container-name-here)/root

小贴士:

进入容器后,您所做的一切都会影响容器的实际进程,例如停止服务或更改端口号。

希望能有所帮助

注意:

此方法仅在容器仍在运行时有效,否则,如果容器已停止或删除,则目录将不再存在

对于一个已经运行的容器,你可以这样做:

dockerId=$(docker inspect -f {{.Id}} [docker_id_or_name])

cd /var/lib/docker/btrfs/subvolumes/$dockerId

你必须是root用户才能cd到那个目录。如果您不是root用户,请先输入“sudo su”再执行该命令。

编辑:在v1.3之后,请参阅Jiri的回答-它更好。

我有一个未知的容器,它正在执行一些生产工作负载,不想运行任何命令。

所以,我使用docker diff。

这将列出容器已更改的所有文件,因此非常适合探索容器文件系统。

如果只获取一个文件夹,你可以使用grep:

docker diff <container> | grep /var/log

它不会显示来自docker映像的文件。根据您的用例,这可能有用,也可能没用。