Сборка 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
Таким образом, вы получите консоль, работающую внутри вашего недавно запущенного контейнера на основе образа, который вы создали с помощью предыдущей команды.