我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
这将为映像启动一个bash会话:
Docker运行——rm -it——entrypoint=/bin/bash
其他回答
试着用
docker exec -it <container-name> /bin/bash
有可能bash没有实现。你可以用这个
docker exec -it <container-name> sh
对于一个已经运行的容器,你可以这样做:
dockerId=$(docker inspect -f {{.Id}} [docker_id_or_name])
cd /var/lib/docker/btrfs/subvolumes/$dockerId
你必须是root用户才能cd到那个目录。如果您不是root用户,请先输入“sudo su”再执行该命令。
编辑:在v1.3之后,请参阅Jiri的回答-它更好。
如果容器停止或没有shell(例如,安装指南中提到的hello-world,或non-alpine traefik),这可能是探索文件系统的唯一可能方法。
你可以将容器的文件系统归档到tar文件中:
docker export adoring_kowalevski > contents.tar
或者列出文件:
docker export adoring_kowalevski | tar t
请注意,根据映像的不同,这可能需要一些时间和磁盘空间。
另一个技巧是使用原子工具来做如下的事情:
mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt
Docker映像将被挂载到/path/to/mnt,以便您检查它。
我使用了另一个肮脏的技巧,即aufs/devicemapper不可知论。
我查看容器正在运行的命令,例如docker ps 如果它是apache或Java,我只做以下事情:
sudo -s
cd /proc/$(pgrep java)/root/
voilá你在容器内。
基本上你可以作为根cd到/proc/<PID>/root/文件夹,只要这个进程是由容器运行的。注意符号链接将没有意义的使用这种模式。