Docker 构建在完成 运行 语句后不会继续
Docker build does not proceed after finishing RUN statement
我正在尝试构建一个 docker 容器(我的第一个容器)来为嵌入式设备设置交叉编译环境。
我包含了一个 RUN
语句,该语句执行一个脚本来安装嵌入式设备制造商提供的 SDK。我验证了,当在 运行ning docker 容器中手动 运行 时,脚本成功完成,退出代码为 0。
但是,在 docker build
期间,同一个脚本打印了它的结束消息,然后就什么也没有发生了。以下 RUN
语句根本没有执行,构建也没有完成。我必须中止构建过程才能返回我的 shell。谁能想象为什么这个特定的 运行 语句没有正确完成,即使执行的脚本成功退出?
有问题的 docker 文件:
# 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
docker build
和docker run
有区别。
build
命令用于从 Dockerfile
开始构建 image
,但图像本身不执行任何操作。你需要 运行 它与 docker run
.
图像 运行ned 后,它变成了一个容器,可以做它想做的事情。
Dockerfile 中的 RUN
命令用于为容器的未来 运行 阶段准备环境,因此使用 RUN
指令您需要安装依赖项,并且大体上做好一切必要的准备环境。示例:
docker build -t <myimagename>:<myimageversion> .
完成此操作后,您可以 运行 您的图片:
docker run -ti <myimagename>:<myimageversion> bash
这样,根据您使用上一个命令构建的映像,您将在新的 运行 容器中得到一个控制台 运行ning。
我通过向 docker 文件添加 WORKDIR
语句将工作目录设置为 /opt/
来解决问题。之后,RUN
语句结束。当从 docker 构建环境中使用绝对路径调用时,安装脚本中一定有东西搞砸了(即使从 docker 中的 shell 调用它也能正常工作容器)。最终的 docker 文件现在包含:
# 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
我自己 运行 遇到了同样的问题。尝试在 docker 图像中安装 Yocto SDK。脚本在完成后似乎卡住了。事实证明你需要耐心等待。我让安装 运行 坐下来,而我 运行 一个错误 运行d 然后我回到了一个成功安装的 SDK。不幸的是,运行 -D 启用调试并没有揭示为什么安装需要如此长的时间。
我正在尝试构建一个 docker 容器(我的第一个容器)来为嵌入式设备设置交叉编译环境。
我包含了一个 RUN
语句,该语句执行一个脚本来安装嵌入式设备制造商提供的 SDK。我验证了,当在 运行ning docker 容器中手动 运行 时,脚本成功完成,退出代码为 0。
但是,在 docker build
期间,同一个脚本打印了它的结束消息,然后就什么也没有发生了。以下 RUN
语句根本没有执行,构建也没有完成。我必须中止构建过程才能返回我的 shell。谁能想象为什么这个特定的 运行 语句没有正确完成,即使执行的脚本成功退出?
有问题的 docker 文件:
# 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
docker build
和docker run
有区别。
build
命令用于从 Dockerfile
开始构建 image
,但图像本身不执行任何操作。你需要 运行 它与 docker run
.
图像 运行ned 后,它变成了一个容器,可以做它想做的事情。
Dockerfile 中的 RUN
命令用于为容器的未来 运行 阶段准备环境,因此使用 RUN
指令您需要安装依赖项,并且大体上做好一切必要的准备环境。示例:
docker build -t <myimagename>:<myimageversion> .
完成此操作后,您可以 运行 您的图片:
docker run -ti <myimagename>:<myimageversion> bash
这样,根据您使用上一个命令构建的映像,您将在新的 运行 容器中得到一个控制台 运行ning。
我通过向 docker 文件添加 WORKDIR
语句将工作目录设置为 /opt/
来解决问题。之后,RUN
语句结束。当从 docker 构建环境中使用绝对路径调用时,安装脚本中一定有东西搞砸了(即使从 docker 中的 shell 调用它也能正常工作容器)。最终的 docker 文件现在包含:
# 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
我自己 运行 遇到了同样的问题。尝试在 docker 图像中安装 Yocto SDK。脚本在完成后似乎卡住了。事实证明你需要耐心等待。我让安装 运行 坐下来,而我 运行 一个错误 运行d 然后我回到了一个成功安装的 SDK。不幸的是,运行 -D 启用调试并没有揭示为什么安装需要如此长的时间。