我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
创建容器之前:
如果你想探索图像的结构,即安装在容器内,你可以这样做
sudo docker image save image_name > image.tar
tar -xvf image.tar
这将使您可以看到图像的所有层及其json文件中的配置。
创建容器后:
对于这个问题,上面已经有很多答案了。我喜欢的方式 这将是
docker exec -t -i container /bin/bash
其他回答
实际上我使用的所有容器都有Python,所以我附加到容器,
pip install jupyterlab
cd /
jupyter lab --allow-root
我^点击Jupyter Lab服务器提供的链接,在主机的浏览器中,我有完美的文件系统GUI,可以打开各种文件(ipnb, py, md(预览),…)
干杯 G。
容器的文件系统在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" ]
我已经找到了最简单的,全能的解决方案,查看,编辑,复制文件与GUI应用程序在几乎任何运行的容器。
MC在docker中编辑文件
docker exec -it <container> /bin/bash,然后提示安装MC和ssh包 在同一个execute -bash控制台中,运行MC 按ESC,然后9,然后ENTER打开菜单,选择“Shell link…” 使用“Shell link…”通过IP地址打开基于scp的文件系统访问任何运行ssh服务器的主机(包括一个运行docker) 你在图形用户界面的工作吗
这种方法克服了权限、快照隔离等所有问题,允许直接复制到任何机器,对我来说是最愉快的使用
我使用了另一个肮脏的技巧,即aufs/devicemapper不可知论。
我查看容器正在运行的命令,例如docker ps 如果它是apache或Java,我只做以下事情:
sudo -s
cd /proc/$(pgrep java)/root/
voilá你在容器内。
基本上你可以作为根cd到/proc/<PID>/root/文件夹,只要这个进程是由容器运行的。注意符号链接将没有意义的使用这种模式。