【问题标题】:Docker build does not proceed after finishing RUN statement完成 RUN 语句后,Docker 构建不继续
【发布时间】:2018-07-02 00:52:55
【问题描述】:

我正在尝试构建一个 docker 容器(我的第一个容器)来为嵌入式设备设置交叉编译环境。

我包含了一个RUN 语句,该语句执行一个脚本,该脚本安装嵌入式设备制造商提供的SDK。我验证了,当在正在运行的 docker 容器中手动运行时,脚本以退出代码 0 成功完成。

但是,在docker build 期间,同样的脚本会打印其完成消息,然后什么都没有发生。以下RUN 语句根本不执行并且构建没有完成。我必须中止构建过程才能回到我的 shell。谁能想象为什么这个特定的运行语句没有正确完成,即使执行的脚本成功退出?

有问题的 dockerfile:

# origin of the image from the official docker hub
FROM ubuntu:trusty

# adding the SDK into the image
ADD tgur-access-sdk-v0.9.0.tar.gz /opt/

# installing necessary dependencies
RUN apt-get update && apt-get install -y \
    g++ \
    gcc \
    make \
    python2.7

# create symlink for python to ensure that the sdk install script succeeds
RUN ln -s /usr/bin/python2.7 /usr/bin/python

# Install the SDK automagically and delete the file afterwards
RUN /opt/gad-eglibc-x86_64-tgur-access-image-base-cortexa9hf-vfp-neon-toolchain-1.0.0.sh -y -d /opt/gad/R9.0/
RUN rm /opt/gad-eglibc-x86_64-tgur-access-image-base-cortexa9hf-vfp-neon-toolchain-1.0.0.sh

# Notify the user about the success
RUN echo "Enjoy your new Docker container"

几分钟后我中止挂起构建的相应输出:

Sending build context to Docker daemon  379.8MB
Step 1/7 : FROM ubuntu:trusty
 ---> 02a63d8b2bfa
Step 2/7 : ADD tgur-access-sdk-v0.9.0.tar.gz /opt/
 ---> Using cache
 ---> 9b6d032ec91e
Step 3/7 : RUN apt-get update && apt-get install -y     g++     gcc     make    python2.7
 ---> Running in 09bdccf10430

[..lots of apt-get msgs..]

Removing intermediate container 09bdccf10430
 ---> 12873d3e50ae
Step 4/7 : RUN ln -s /usr/bin/python2.7 /usr/bin/python
 ---> Running in c1b8256e1fd0
Removing intermediate container c1b8256e1fd0
 ---> 166d5473a18f
Step 5/7 : RUN /opt/gad-eglibc-x86_64-tgur-access-image-base-cortexa9hf-vfp-neon-toolchain-1.0.0.sh -y -d /opt/gad/R9.0/
 ---> Running in aff8a5f102f8
Enter target directory for SDK (default: /opt/gad/1.0.0): /opt/gad/R9.0/
You are about to install the SDK to "/opt/gad/R9.0". Proceed[Y/n]?Y
Extracting SDK...done
Setting it up...done
SDK has been successfully set up and is ready to be used.
^C

【问题讨论】:

  • 回答你的问题我想我们应该知道(gad-eglibc-x86_64-tgur-access-image-base-cortexa9hf-vfp-neon-toolchain-1.0.0.sh)的内容脚本。
  • 它是二进制文件,因此不可打印。虽然它有一个调试开关,但它确实是set -x。我将再次运行并将输出粘贴到最初的问题中。
  • 我自己在玩的时候找到了一个解决方案。我在执行脚本之前添加了一个WORKDIR 语句来更改WD。看我的回答。

标签: docker dockerfile docker-build


【解决方案1】:

docker builddocker run 之间存在差异。

build 命令用于从Dockerfile 开始构建image,但图像本身不执行任何操作。您需要使用docker run 运行它。

图像运行后,它变成了一个容器,它可以做它应该做的事情。

Dockerfile 中的RUN 命令用于为容器的未来运行阶段准备环境,因此使用RUN 指令您需要安装依赖项,并且通常会执行准备环境所需的所有操作。示例:

docker build -t <myimagename>:<myimageversion> .

完成此操作后,您可以使用以下命令运行映像:

docker run -ti <myimagename>:<myimageversion> bash

这样,您最终会在新运行的容器中运行一个控制台,该控制台基于您使用上一个命令构建的映像。

【讨论】:

  • 感谢您的回答,但这根本不包括我的问题。需要 dockerfile 中的 RUN 语句来设置环境,稍后应该通过发出 docker run 来启动该环境。但这不是问题。
  • 好的,那么您的问题根本不清楚。你是说:“但是,在 docker 构建期间,相同的脚本会打印其完成消息,然后什么都没有发生。”这就是 docker build 按设计工作的方式,这就是我试图用我的回答来解释的内容
  • 但是当我在构建过程中运行其他命令,甚至是自己编写的脚本时,RUN 语句会随后执行,直到docker build 宣布它通过声明完成:Successfully built d36c2e412129 Successfully tagged xyz:latest
【解决方案2】:

我通过将WORKDIR 语句添加到将工作目录设置为/opt/ 的dockerfile 解决了这个问题。之后,RUN 语句完成。当从 docker 构建环境内部使用绝对路径调用时,安装脚本中一定有一些东西会弄乱事情(即使它在从 docker 容器中的 shell 调用时也能工作)。最终的 dockerfile 现在包含:

# Install the SDK automagically and delete the file afterwards

WORKDIR /opt
RUN ./gad-eglibc-x86_64-tgur-access-image-base-cortexa9hf-vfp-neon-toolchain-1.0.0.sh -D -y -d /opt/gad/R9.0
RUN rm gad-eglibc-x86_64-tgur-access-image-base-cortexa9hf-vfp-neon-toolchain-1.0.0.sh

【讨论】:

  • 偶然发现了同样的问题,但不幸的是同样的方法没有帮助:(
【解决方案3】:

我自己也遇到了同样的问题。尝试在 docker 映像中安装 Yocto SDK。脚本完成后似乎卡住了。事实证明,您需要耐心等待。当我跑腿时,我让安装运行坐下来,然后我回到了成功安装的 SDK。不幸的是,使用 -D 运行以启用调试并没有揭示为什么安装需要这么长时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多