Команды Docker успешно запускают контейнер, но не работают с Dockerfile

У меня есть команда, которую я запускаю, для установки поддержки Cuda в Ubuntu 14.04. Для этого я запускаю следующую команду, представляющую собой серию комбинированных команд:

apt-get install -y software-properties-common && add-apt-repository -y ppa:graphics-drivers/ppa && apt-get --purge remove "nvidia*" && apt-get --purge remove "cuda*" && cd Downloads && dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb && apt-get -y update && apt-get -y upgrade && apt-get install -y cuda
  • Когда я делаю это на работающем контейнере, т.е. мой Dockerfile содержит только команду FROM ubuntu:14.04, тогда я использую docker run -it <my new image name> bash и все получается!

  • Когда я делаю это из Dockerfile, он получает много ошибок времени выполнения, таких как:

    invoke-rc.d: policy-rc.d запретил выполнение принудительной перезагрузки.

    invoke-rc.d: policy-rc.d отклонил запуск start.

Я хочу уточнить - это удается, когда я запускаю bash в контейнере и шаг за шагом выполняю команды Dockerfile, но терпит неудачу, если я выполняю то же самое, что и команды RUN в файле docker, используя docker build.

Любая идея, в чем может быть проблема и как ее решить?

Хочу отметить, что я видел кое-где людей, которые добавляют в свой dockerfile следующую команду:

RUN echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d

Нет ничего изящнее? Разве это не разные разрешения при запуске docker build против docker run -it ?


person SomethingSomething    schedule 23.03.2017    source источник


Ответы (1)


Здесь это хороший пост, который пытается найти причину проблемы, с которой вы столкнулись.

Короткий путь:

  1. RUN echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d должен решить вашу проблему ИЛИ

  2. Если это не решит проблему, попробуйте запустить док-контейнер с параметром privileged. Вот так, docker run --privileged -d -ti DOCKER_IMAGE:TAG

В идеале я бы не рекомендовал запускать контейнер с опцией privileged, если это не тестовый контейнер. Причина в том, что запуск док-контейнера с привилегиями дает контейнеру все возможности, а также снимает все наложенные ограничения. Другими словами, контейнер может делать почти все, что может делать хост. Но это не очень хорошая практика. Это побеждает цель докера по изоляции от хост-машины.

Идеальный способ сделать это — set capabilities вашего док-контейнера в зависимости от того, чего вы хотите достичь. Поиск в Google поможет вам предоставить соответствующий capability для вашего док-контейнера.

person Nikhil Katre    schedule 14.02.2018
comment
Не рекомендуется запускать докер в режиме --privileged. Docker предназначен для изоляции от хост-машины. - person chintan thakar; 14.02.2018
comment
Я согласен с тобой @chintanthakar. Вероятно, это не лучший и рекомендуемый способ запуска с --priviledged. Я думаю, что лучше всего было бы установить возможности внутри контейнера в зависимости от того, что вы пытаетесь сделать. - person Nikhil Katre; 14.02.2018
comment
какой пакет должен быть установлен, содержащий этот файл policy-rc.d? это не имеет большого смысла... - person Dave Ankin; 27.03.2021
comment
о, он содержит «выход 101» внутри докера в образе Ubuntu 20 - person Dave Ankin; 27.03.2021