我正在尝试为我们的开发过程构建一个新的Docker映像,cpanm用于安装一堆Perl模块作为各种项目的基础映像。
cpanm
开发Dockerfile时,cpanm返回失败代码,因为某些模块安装不干净。
我相当确定我需要apt安装更多东西。
apt
我的问题是,在哪里可以找到/.cpanm/work输出中引用的目录,以便检查日志?在一般情况下,如何检查失败docker build命令的文件系统?
/.cpanm/work
docker build
早上编辑 咬住子弹并运行后,find我发现
find
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
这是可靠的吗?还是我最好还是构建一个“裸”容器并手动运行东西,直到我拥有所需的一切为止?
每当RUNdocker 成功从Dockerfile 执行命令时,都会提交映像文件系统中的新层。您可以方便地将这些图层ID用作图像来启动新容器。
RUN
采取以下Dockerfile:
FROM busybox RUN echo 'foo' > /tmp/foo.txt RUN echo 'bar' >> /tmp/foo.txt
并构建它:
$ docker build -t so-2622957 . Sending build context to Docker daemon 47.62 kB Step 1/3 : FROM busybox ---> 00f017a8c2a6 Step 2/3 : RUN echo 'foo' > /tmp/foo.txt ---> Running in 4dbd01ebf27f ---> 044e1532c690 Removing intermediate container 4dbd01ebf27f Step 3/3 : RUN echo 'bar' >> /tmp/foo.txt ---> Running in 74d81cb9d2b1 ---> 5bd8172529c1 Removing intermediate container 74d81cb9d2b1 Successfully built 5bd8172529c1
您现在可以开始从一个新的容器00f017a8c2a6,044e1532c690和5bd8172529c1:
00f017a8c2a6
044e1532c690
5bd8172529c1
$ docker run --rm 00f017a8c2a6 cat /tmp/foo.txt cat: /tmp/foo.txt: No such file or directory $ docker run --rm 044e1532c690 cat /tmp/foo.txt foo $ docker run --rm 5bd8172529c1 cat /tmp/foo.txt foo bar
当然,您可能想启动一个Shell来探索文件系统并尝试命令:
$ docker run --rm -it 044e1532c690 sh / # ls -l /tmp total 4 -rw-r--r-- 1 root root 4 Mar 9 19:09 foo.txt / # cat /tmp/foo.txt foo
当Dockerfile命令之一失败时,您需要做的是查找 上一层 的 ID, 并在根据该ID创建的容器中运行Shell:
docker run --rm -it <id_last_working_layer> bash -il
放入容器后:
如果您真的需要试验失败的实际层而不是从最后一个工作层开始工作,请参阅Drew的答案。