完成RUN语句后,Docker构建不会继续

时间:2018-01-23 09:01:19

标签: docker dockerfile docker-build

我正在尝试构建一个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

3 个答案:

答案 0 :(得分:1)

我通过在dockerfile中添加WORKDIR语句来解决问题,该语句将工作目录设置为/opt/。之后,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

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

docker builddocker run之间存在差异。

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

运行图像后,它将成为一个容器,它可以完成它的意图。

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

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

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

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

这样,您最终将在新运行的容器内运行一个控制台,具体取决于您使用上一个命令构建的映像。