Сборка с докером и --привилегированным

Я использую это руководство по созданию голосового комплекта с помощью Amazon Lex и Raspberry Pi, но мне нужно использовать Docker. Проблема в том, что скрипт, который закручивает и запускает руководство, требует доступа к /dev/tty. Я могу предоставить доступ к /dev/tty при запуске docker-контейнеров, но я не знаю, как это сделать при создании контейнеров.

Мой Dockerfile выглядит так:

FROM resin/rpi-raspbian

WORKDIR /app

ADD . /app

#The script requires these
RUN apt-get update
RUN apt-get install iputils-ping

#The script has to be run with sudo priviliges but not as root
USER root
ADD /sudoers.txt /etc/sudoers
RUN chmod 440 /etc/sudoers


RUN useradd -ms /bin/bash lex
RUN echo 'lex:test' | chpasswd

RUN curl https://get.pimoroni.com/phatdac | bash 

USER lex

EXPOSE 80

#Comment the last RUN command and uncomment this
#CMD curl https://get.pimoroni.com/phatdac | bash 

И когда я пытаюсь создать контейнер с помощью

docker build -t raspi1 .

он вылетает из скрипта, потому что не может получить доступ к /dev/tty.

При запуске контейнера я могу использовать этот скрипт для предоставления доступа к /dev/tty и /dev/snd.

#!/bin/sh

 docker run -ti --rm \
     -v /dev/snd:/dev/snd \
      --privileged \
     raspi7 

а затем попробуйте использовать скрипт при запуске с помощью CMD в Dockerfile. Но если я это сделаю, то мне нужно будет использовать скрипт каждый раз при запуске, и мне также нужно будет выполнять RUN для других вещей после завершения скрипта, что было бы неплохо иметь в Dockerfile при сборке.

TLDR; Как предоставить привилегии /dev/tty и /dev/snd при создании образа докера?


person Alqio    schedule 04.01.2018    source источник
comment
не связаны, но вы должны сгруппировать RUN (см. docs.docker.com /engine/userguide/eng-image/) , а ваша строка user ROOT бесполезна, так как по умолчанию вы root, если только вы не сделаете USER xxxто, что сделаете позже   -  person user2915097    schedule 04.01.2018
comment
см. также устройство tty в контейнере докеров с докером для mac"> stackoverflow.com/questions/40442284/   -  person user2915097    schedule 04.01.2018
comment
Спасибо, но они еще не решают эту проблему.   -  person Alqio    schedule 04.01.2018


Ответы (2)


В настоящее время Docker не поддерживает предоставление доступа к устройствам или, если на то пошло, привилегированные операции при сборке.

По словам @cpuguy83, то, что вы делаете сейчас - создание переносимого образа без доступа к хосту и завершение настройки при первом запуске контейнера - это правильно:

Делать такие вещи при первом запуске контейнера — это правильный путь. Это конфигурация времени выполнения, ее не должно быть в образе.

См. источник вознаграждений.

Существует также старая, но все еще открытая проблема moby.

person Greg    schedule 17.07.2019

Ваша проблема, вероятно, в том, что /dev/snd не существует внутри вашего образа докера. Когда вы запускаете свой контейнер, вы фактически монтируете хост-ОС /dev/snd внутри контейнера, чтобы можно было запустить ваш скрипт. Взгляните на следующее:

[INSERT] > cat Dockerfile
FROM resin/rpi-raspbian

RUN ls /dev && ls /dev/tty && ls /dev/snd


[INSERT] > docker build .
Sending build context to Docker daemon  39.94kB
Step 1/2 : FROM resin/rpi-raspbian
 ---> d008ca006edc
Step 2/2 : RUN ls /dev && ls /dev/tty && ls /dev/snd
 ---> Running in 0b738007c71c
core
fd
full
mqueue
null
ptmx
pts
random
shm
stderr
stdin
stdout
tty
urandom
zero
/dev/tty
/bin/ls: cannot access /dev/snd: No such file or directory
The command '/bin/sh -c ls /dev && ls /dev/tty && ls /dev/snd' returned a non-zero code: 2

Как видите, /dev/tty существует, и у вас есть к нему доступ. /dev/snd не существует, и вы не находитесь внутри работающего контейнера, поэтому вы не можете смонтировать его как том (что вы делаете при запуске контейнера). Я бы порекомендовал попытаться более полно понять, что делает скрипт, который вы запускаете, оценить, нужен ли ему доступ к /dev/snd хост-компьютера, и если да, вы можете запустить скрипт только внутри работающего контейнера, поскольку образ не иметь какое-либо понятие хост-машины.

person mrfred    schedule 04.01.2018