Инструкция по запуску Docker для исходного профиля bash - PullRequest
0 голосов
/ 12 апреля 2019

Я запускаю некоторые установочные скрипты через docker, они меняют ~ / .bashrc, но затем мне нужно найти его, чтобы использовать установленные команды в инструкциях RUN ниже.

Пробовал очевидное RUN . ~/.bashrc и получил /bin/sh: 13: /root/.bashrc: shopt: not found ошибку.

Пробовал RUN . ~/.profile и получил mesg: ttyname failed: Inappropriate ioctl for device

Я не хочу использовать инструкции ENV,Смысл наличия внешних сценариев установки состоит в том, чтобы использовать их в средах, отличных от Docker, например, при локальном запуске модульных тестов.Инструкции ENV дублируют настройку среды, которая уже сделана в сценариях установки.

1 Ответ

0 голосов
/ 12 апреля 2019

Вы не должны пытаться настроить файлы точек оболочки в Docker.Многие типичные пути не проходят их вообще;например

# In a Dockerfile
CMD ["some", "command", "here"]

# From the command line
docker run myimage some command here

Среда Docker принципиально отличается от автономной системы Linux;В дополнение к точечным файлам оболочки, «домашний каталог» на самом деле не является концепцией Docker, и если у вас есть процесс, состоящий из нескольких частей, в Docker стандартно запускать каждую часть в отдельном контейнере, но в автономном Linux вы можете использовать initсистема, чтобы все части работали вместе.Если вы ожидаете, что все будет работать одинаково с теми же сценариями установки, виртуальная машина будет лучшим технологическим соответствием тому, что вы пытаетесь.

(«Несоответствующий ioctl для устройства» также предполагает, чтов точечных файлах есть вещи, которые сильно ожидают запуска от реального терминала, который вам не обязательно иметь в docker build раз.)

Мой общий совет:

  1. Если возможно, установите вещи в «системные» каталоги в образе и избегайте необходимости настраивать переменные среды.(Не используйте менеджер версий, такой как nvm или rvm; не используйте виртуальную среду Python.)
  2. Если вам нужно установить переменные окружения, ENV - это способ сделать это.
  3. Если вы действительно не можете выполнить ни одно из перечисленных выше действий, вы можете установить переменные окружения в скрипте ENTRYPOINT перед запуском основного процесса;но если для вас важно, чтобы переменные отображались в оболочках docker inspect или docker exec, они там не будут установлены.

(Также помните, что каждая команда RUN запускает новый контейнерс совершенно новой оболочкой. Вы можете RUN . .profile; foo, но настройки переменных среды не будут перенесены на следующую строку RUN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...