Docker构建挂起。我怎么看发生了什么事?

Dea*_*lze 4 docker

下载完成后,此Dockerfile会挂起:

FROM ubuntu:18.04
MAINTAINER Dean Schulze

ENV JS_CE_VERSION 7.1.0
ENV JS_CE_HOME /opt/jasperreports-server-cp-${JS_CE_VERSION}
ENV PATH $PATH:${JS_CE_HOME}

RUN apt-get update && apt-get install -y wget \
&& wget --progress=bar:force:noscroll -O TIB_js-jrs-cp_${JS_CE_VERSION}_linux_x86_64.run https://sourceforge.net/projects/jasperserver/files/JasperServer/JasperReports%20Server%20Community%20Edition%20${JS_CE_VERSION}/TIB_js-jrs-cp_${JS_CE_VERSION}_linux_x86_64.run \
&& chmod a+x TIB_js-jrs-cp_${JS_CE_VERSION}_linux_x86_64.run \
&& /TIB_js-jrs-cp_${JS_CE_VERSION}_linux_x86_64.run --mode unattended --jasperLicenseAccepted yes --postgres_password Postgres1 --prefix ${JS_CE_HOME} \
&& rm TIB_js-jrs-cp_${JS_CE_VERSION}_linux_x86_64.run \
&& rm -rf ${JS_CE_HOME}/apache-ant ${JS_CE_HOME}/buildomatic \
${JS_CE_HOME}/docs ${JS_CE_HOME}/samples ${JS_CE_HOME}/scripts \
&& apt-get clean

EXPOSE 8080

CMD ctlscript.sh start && tail -f /dev/null
Run Code Online (Sandbox Code Playgroud)

输出的最后几行是

Resolving superb-dca2.dl.sourceforge.net (superb-dca2.dl.sourceforge.net)... 209.61.193.20
Connecting to superb-dca2.dl.sourceforge.net (superb-dca2.dl.sourceforge.net)|209.61.193.20|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 343517555 (328M) [application/x-makeself]
Saving to: 'TIB_js-jrs-cp_7.1.0_linux_x86_64.run'

TIB_js-jrs-cp_7.1.0 100%[===================>] 327.60M  1.60MB/s    in 3m 52s  

2018-07-28 03:15:28 (1.41 MB/s) - 'TIB_js-jrs-cp_7.1.0_linux_x86_64.run' saved [343517555/343517555]
Run Code Online (Sandbox Code Playgroud)

我如何诊断像这样挂起的Docker构建?

编辑

这是请求的输出:

$ docker image history d5d47e51eafc
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
d5d47e51eafc        23 minutes ago      /bin/sh -c #(nop)  ENV PATH=/usr/local/sbin:…   0B                  
831a3a551fa7        23 minutes ago      /bin/sh -c #(nop)  ENV JS_CE_HOME=/opt/jaspe…   0B                  
e8361426e492        23 minutes ago      /bin/sh -c #(nop)  ENV JS_CE_VERSION=6.3.0      0B                  
7af364f52b1b        23 minutes ago      /bin/sh -c #(nop)  MAINTAINER JS Minet          0B                  
735f80812f90        30 hours ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           30 hours ago        /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B                  
<missing>           30 hours ago        /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   2.76kB              
<missing>           30 hours ago        /bin/sh -c rm -rf /var/lib/apt/lists/*          0B                  
<missing>           30 hours ago        /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   745B                
<missing>           30 hours ago        /bin/sh -c #(nop) ADD file:4bb62bb0587406855…   83.5MB              
Run Code Online (Sandbox Code Playgroud)

看起来这些行是相反的顺序,最后执行的是ENV PATH。下一行将是RUN包含多个命令(由分隔)的行&&

这是对DockerHub上Dockerfile的修改。我更改了ubuntu版本和正在安装的应用程序的版本。那不应该破坏任何东西。

我应该提交错误报告吗?

Lia*_*avK 8

在过去几年的某个时候,Buildkit 已经成为默认的 Docker 后端。作为性能优化,Buildkit 不会将中间层写为图像。因此,如果您需要调试挂起的 docker 构建,请注释掉构建挂起的行以及所有后续行。您现在拥有一个可以用来执行的 Dockerfile $ docker build .。构建完成后,您可以启动映像,bash 进入容器,运行导致构建挂起的命令,然后检查容器的状态以调试情况。


Ber*_*ard 5

首先列出完成或不完整图像的“层”。每层通常对应于Dockerfile中的一条指令。

使用识别图像ID

docker image ls
Run Code Online (Sandbox Code Playgroud)

然后使用列出图像中的图层

docker image history <ID>
Run Code Online (Sandbox Code Playgroud)

您将看到如下内容:

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
6c32fe3da793        2 days ago          /bin/sh -c #(nop) COPY file:c25ef1dcc737cb59…   635B                
4c1309db9b9c        2 days ago          /bin/sh -c #(nop) COPY dir:30506cf0fc0cdb096…   8.64kB              
5f5ae40b5fd5        3 weeks ago         /bin/sh -c apk update && apk add --no-cache …   164MB               
989d78741d0b        3 weeks ago         /bin/sh -c #(nop)  ENV DOCKER_VERSION=18.03.…   0B                  
6160911711fc        3 weeks ago         /bin/sh -c #(nop)  CMD ["python3"]              0B                  
... etc
Run Code Online (Sandbox Code Playgroud)

然后从图像内的任何位置创建一个容器。从那里,您可以执行下一条指令,这将在Dockerfile中引起问题。

例如:

docker run -it --rm 4c1309db9b9c sh
Run Code Online (Sandbox Code Playgroud)

  • 我正在描述如何调试您的Dockerfile,这正是我以为您要的。当您执行docker build。时,Docker将创建一个临时容器并运行Dockerfile中列出的指令。最后,它创建一个映像并丢弃该临时容器。我描述的步骤允许您随时在相应的Dockerfile中登录到容器。您可以检查环境并一步一步执行以找出问题,然后修复Dockerfile。 (6认同)

Dea*_*lze 1

我通过回滚到ubuntu 16.04. 一定有一些变化18.04导致这个 Dockerfile 失败,或者ubuntu 18.04镜像可能遗漏了一些东西。