Вот три причины, по которым я думаю, вам следует пересмотреть использование Docker и убедиться, что вы получаете максимальную отдачу от контейнеров.
у вас есть изображение с именем ...-node-10
. Вы не должны нуждаться в определенных изображениях для определенных узлов. Все они должны работать на одном образе и, по мере необходимости, настраиваться во время выполнения (это должно быть сведено к минимуму, обычно такие вещи, как обнаружение или динамическое конфигурирование). Если 10
является версией, вы должны использовать теги для ее версии, а не сам идентификатор изображения.
Существует действительный вариант использования для одноразового выполнения установки в работающем контейнере через exec
для одноразовых установок пакета (при условии, что установка исчезнет, когда контейнер остановится), но docker run ... apt-get install
на самом деле не имеет смысла для меня. Как указывает @DavidMaze в комментарии к вопросу, установки, которые должны быть, всегда должны быть частью Dockerfile. Если вы устанавливаете пакеты в долгоживущие контейнеры - не надо и не надо. Худшее, что случается с людьми с докером, это то, что они пытаются обращаться с контейнерами как с долгоживущими виртуальными машинами, когда они должны рассматривать их как эфемерные среды выполнения , которые поддерживают минимальное состояние, по существу неизменными (и, следовательно, легко заменяемыми). в следующей версии) их образ содержит все их зависимости во время установки и хранит любые долгосрочные данные на отдельном томе док-станции (который, как мы надеемся, сам резервируется).
Скорее всего, пользователь настраивает ваше приложение для запуска в качестве пользователя USER в вашем Dockerfile, но вы пытаетесь запустить привилегированные команды, не устанавливая для своего пользователя значение USER. Затем вы пытаетесь запустить sudo
. Но sudo
не имеет особого смысла в контексте контейнера и, как правило, не устанавливается (и если бы это было так, это означало бы, что вам нужно каким-то образом настроить пользователя на sudo, поэтому это не твоя жизнь проще, просто сложнее). Вы можете установить для пользователя docker exec
время на root
с docker exec -u root ...
. Но вам не нужно этого делать - все настройки должны быть выполнены в Dockerfile, и вы должны отправить новый dockerfile для изменения версий.
Я сам являюсь очень активным пользователем докера и собираю в нем практически все приложения, потому что он настолько сильно упрощает выражение их требований времени выполнения, поэтому я думаю, что я говорю здесь с точки зрения опыта. Вы не получите никакого значения от docker, если ваши контейнеры не являются неизменяемыми; у вас будут те же проблемы, что и без контейнеров, но с меньшим количеством инструментов управления. Докер избегает большей части управления во время выполнения - извлекайте выгоду из этого, не боритесь с этим.