Вы не должны пытаться настроить файлы точек оболочки в 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
раз.)
Мой общий совет:
- Если возможно, установите вещи в «системные» каталоги в образе и избегайте необходимости настраивать переменные среды.(Не используйте менеджер версий, такой как nvm или rvm; не используйте виртуальную среду Python.)
- Если вам нужно установить переменные окружения,
ENV
- это способ сделать это. - Если вы действительно не можете выполнить ни одно из перечисленных выше действий, вы можете установить переменные окружения в скрипте
ENTRYPOINT
перед запуском основного процесса;но если для вас важно, чтобы переменные отображались в оболочках docker inspect
или docker exec
, они там не будут установлены.
(Также помните, что каждая команда RUN
запускает новый контейнерс совершенно новой оболочкой. Вы можете RUN . .profile; foo
, но настройки переменных среды не будут перенесены на следующую строку RUN
.