我正在尝试构建一个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
答案 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 build
和docker run
之间存在差异。
build
命令用于从image
开始构建Dockerfile
,但图像本身不执行任何操作。您需要使用docker run
运行它。
运行图像后,它将成为一个容器,它可以完成它的意图。
Dockerfile中的RUN
命令用于为容器的未来运行阶段准备环境,因此使用RUN
指令需要安装依赖项,并且通常需要执行所有操作准备环境。例如:
docker build -t <myimagename>:<myimageversion> .
完成此操作后,您可以使用以下命令运行图像:
docker run -ti <myimagename>:<myimageversion> bash
这样,您最终将在新运行的容器内运行一个控制台,具体取决于您使用上一个命令构建的映像。