我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
更新:探索!
这个命令应该让你探索一个正在运行的docker容器:
docker exec -it name-of-container bash
在docker-compose中等价的是:
docker-compose exec web bash
(web是本例中的服务名称,默认情况下为tty。)
一旦你进去了:
ls -lsa
或任何其他bash命令,如:
cd ..
这个命令可以让你浏览docker映像:
docker run --rm -it --entrypoint=/bin/bash name-of-image
进入后:
ls -lsa
或任何其他bash命令,如:
cd ..
它代表互动…和遥控。
这个命令可以让你检查一个正在运行的docker容器或镜像:
Docker检查容器名称或映像
您可能想要这样做,并找出其中是否有bash或sh。在json返回中寻找entrypoint或cmd。
注意:这个答案依赖于常见的工具,但如果没有bash shell或常见的工具,如ls,你可以先在一个层中添加一个,如果你可以访问Dockerfile: 例如alpine:
RUN apk add --no-cache bash
否则,如果你无法访问Dockerfile,那么只需从新创建的容器中复制文件,并通过以下方式查看它们:
docker create <image> # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah
参见docker exec文档
参见docker-compose exec文档
参见docker inspect文档
参见docker创建文档
其他回答
另一个技巧是使用原子工具来做如下的事情:
mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt
Docker映像将被挂载到/path/to/mnt,以便您检查它。
这将为映像启动一个bash会话:
Docker运行——rm -it——entrypoint=/bin/bash
对于docker aufs驱动程序:
脚本将找到容器根目录(在docker 1.7.1和1.10.3上进行测试)
if [ -z "$1" ] ; then
echo 'docker-find-root $container_id_or_name '
exit 1
fi
CID=$(docker inspect --format {{.Id}} $1)
if [ -n "$CID" ] ; then
if [ -f /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id ] ; then
F1=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id)
d1=/var/lib/docker/aufs/mnt/$F1
fi
if [ ! -d "$d1" ] ; then
d1=/var/lib/docker/aufs/diff/$CID
fi
echo $d1
fi
在我的例子中,除了sh,容器中不支持任何shell。所以,这就像一个魅力
docker exec -it <container-name> sh
虽然姗姗来迟,但在2022年我们有了VS Code