如果容器立即退出,是否探索Docker的映像文件?

时间:2018-10-29 12:03:12

标签: docker dockerfile

我有一个从Docker集线器提取的Docker映像。

运行docker run image_name时,容器立即退出。

我无权访问Docker映像的源代码,包括Dockerfile。我所拥有的只是我从hub.docker.com提取的一张图片。

我需要调试/查看映像中的内容(例如查看和浏览映像的文件系统),而无需将其作为容器运行。

有可能吗?

3 个答案:

答案 0 :(得分:4)

从所需图像启动容器,如下所示:

docker run -it --rm image_name bash

-i即使未连接STDIN也保持打开状态

-t分配一个伪tty

--rm修剪退出后停止的容器

bash在容器中执行特定命令。您可以执行任何有效的命令。

示例docker run -it --rm centos:7 pwd输出/(根目录)。

答案 1 :(得分:2)

无需run容器即可查看“内部”的另一种方法是:

docker image history <your image name>

请参见docs here

这不会给您列出目录和文件的选项,但是您可以在不运行容器的情况下获得其中的第一张图片(如果所有者发布了恶意图像,则可能会有风险)。

带有nginx:latest图片的示例:

$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
f17d81b4b692: Pull complete 
d5c237920c39: Pull complete 
a381f92f36de: Pull complete 
Digest: sha256:b73f527d86e3461fd652f62cf47e7b375196063bbbd503e853af5be16597cb2e
Status: Downloaded newer image for nginx:latest

$ docker image history nginx
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
dbfc48660aeb        13 days ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  STOPSIGNAL [SIGTERM]         0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  EXPOSE 80/tcp                0B                  
<missing>           13 days ago         /bin/sh -c ln -sf /dev/stdout /var/log/nginx…   22B                 
<missing>           13 days ago         /bin/sh -c set -x  && apt-get update  && apt…   53.8MB              
<missing>           13 days ago         /bin/sh -c #(nop)  ENV NJS_VERSION=1.15.5.0.…   0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.15.5-…   0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
<missing>           13 days ago         /bin/sh -c #(nop) ADD file:f8f26d117bc4a9289…   55.3MB

答案 2 :(得分:0)

您可以通过更改Dockerfile的ENTRYPOINT来运行/ bin / bash而不是ENTRYPOINT / CMD来实现。

这将生成一个新图像,您可以自己登录并运行该应用程序(如果原始图像退出,则很容易调试)

# comment the CMD/ENTRYPOINT
### ENTRYPOINT ["/opt/my_app.sh"]

# make a new CMD that simply starts /bin/bash
CMD ["/bin/bash"]

然后构建图像:

$ docker build -t srvtemp .

然后运行:

$ docker exec -ti srvtemp /bin/bash

或者,您可以将--entrypoint / bin / bash添加到docker exec命令args

$ docker run -ti --name srvtemp --entrypoint /bin/bash