Сборка Docker не продолжается после завершения оператора RUN

Я пытаюсь создать докер-контейнер (мой первый в истории) для настройки среды кросс-компиляции для встроенного устройства.

Я включил RUN оператор, который выполняет сценарий, который устанавливает SDK, предоставленный производителем встроенного устройства. Я проверил, что сценарий успешно завершается с кодом завершения 0, когда запускается вручную в работающем Docker-контейнере.

Однако во время docker build, тот же самый скрипт печатает свое завершающее сообщение, и тогда больше ничего не происходит. Следующие RUN операторы не выполняются и сборка не завершается. Я должен прервать процесс сборки, чтобы вернуться к своей оболочке. Кто-нибудь может представить, почему этот конкретный оператор run не завершается должным образом, даже если выполненный сценарий завершается успешно?

Рассматриваемый докер-файл:

# 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

2 ответа

Решение

Я решил проблему, добавив WORKDIR заявление в файл Docker, который устанавливает рабочий каталог /opt/, После этого RUN Заявление заканчивается. Внутри скрипта установки должно быть что-то, что портит вещи, когда вызывается с абсолютным путем изнутри среды сборки докера (даже когда это работает, когда вызывается из оболочки в контейнере докера). Последний докер-файл теперь содержит:

# 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

Я сам столкнулся с той же проблемой. Попытка установить Yocto SDK в образе докера. Похоже, что скрипт завис после завершения. Оказывается, нужно запастись терпением. Я оставил установку, пока выполнял поручение, и вернулся к успешно установленному SDK. К сожалению, запуск с -D для включения отладки не показал, почему установка занимает столько времени.

Есть разница между docker build а также docker run,

build Команда используется для построения image начиная с DockerfileНо изображение само по себе ничего не делает. Вам нужно запустить его с docker run,

После запуска изображения оно становится контейнером и может делать то, для чего оно предназначено.

RUN Команды внутри вашего Dockerfile используются для подготовки среды к будущей фазе запуска контейнера, поэтому с RUN В инструкции нужно установить зависимости и вообще сделать все необходимое для подготовки среды. Пример:

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

После этого вы можете запустить свой образ с помощью:

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

Таким образом, вы получите консоль, работающую внутри вашего недавно запущенного контейнера на основе образа, который вы создали с помощью предыдущей команды.

Другие вопросы по тегам