Docker и Ubuntu: как навсегда установить программное обеспечение?

  • Предпосылки: Я запускаю свой док-контейнер с помощью docker run -it ubuntu .
  • Что я хочу сделать: Я хотел бы постоянно устанавливать любое программное обеспечение из репозиториев внутри этого контейнера (например, возьмем gjiten ).
  • Проблема: После выхода из контейнера установленное программное обеспечение исчезнет.
  • Вопрос: Как мне постоянно устанавливать программное обеспечение (например, gjiten ) в моем контейнере?

Разное

  • Тома Afaik не работают, потому что я не могу сказать apt , где установить пакет. (Если apt допускает указание целевого каталога, это будет это лучшее решение.)
  • Я знаю, что могу использовать образы приложений в томах докеров, но тогда я не могу использовать apt , и обновление программного обеспечения становится болезненным.
  • Я знаю w Я мог бы создать chroot на томе докера, но это оказалось довольно болезненным.

Изменить: Ответ:

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

0
задан 6 December 2020 в 05:08

4 ответа

Одно решение

Если есть доступ к хост-машине, одним из решений может быть фиксирует изменения. Тем не менее, это создаст совершенно новый образ.

Инструкции отсюда :

  • запустить контейнер
  • изменить что-то внутри контейнера
  • Определить идентификатор контейнера
    • Например. правая часть root @ 9a20cddf27c0 в контейнере
  • На хосте запустите docker commit [идентификатор контейнера] [имя нового образа]

Реквизиты: @Kulfy из комментариев.

0
ответ дан 3 January 2021 в 22:47

Я думаю, вам нужно понять идея образа контейнера . Существует четкое различие между контейнерами и образами контейнеров .

Каждый контейнер запускается из статического образа. Сам образ представляет собой сжатый пакет, в котором есть все необходимое для запуска данного программного обеспечения (двоичные файлы, прямые зависимости, сторонние зависимости, файлы конфигурации, пользователи, разрешения для файлов и все это).

После запуска контейнера все он создает эфемерный, а пользовательские данные сохраняются в томах вне контейнера.

Если вам требуется постоянная установка определенной библиотеки или пакета, вам необходимо изменить образ. На практике это означает создание собственного Dockerfile и наследование ОТ базового образа, который вы хотите изменить. Создав свой образ, вы можете запускать контейнеры на его основе.

Официальные документы в наши дни довольно ясны: https://docs.docker.com/get-started/part2/

0
ответ дан 3 January 2021 в 22:47

I Выяснилось, что мое восприятие среды докера было неправильным, поэтому возник этот вопрос.

Важно

Информация из завершенного контейнера не потеряна! Установленные программы сохраняются даже после выхода *. Таким образом, этот вопрос в основном устарел.

Далее я пытаюсь прояснить, как docker работает в этом отношении.

* Это противоречит комментарию Кулфи «Когда вы выходите из экземпляра или завершаете службу docker, изменения и файлы теряются, если изменения не были зафиксированы во время использования образа ».

Как работает Docker в целом

  • docker run ubuntu создает контейнер из образа ubuntu .
  • ] Контейнер будет работать, пока работает основной процесс.
  • Поскольку основной процесс в образе ubuntu завершится немедленно, контейнер немедленно выйдет (так что вызов немедленно возвращается в оболочке).
  • Выход из контейнера похоже только на выключение системы. Контейнер не потерян. Изменения данных / системы по-прежнему сохраняются.
    • Вы можете проверить это с помощью docker ps -a , который покажет вам даже закрытые контейнеры.

Вопрос, связанный с

  • docker run -it ubuntu создает контейнер из образа ] ubuntu и запускает интерактивный режим в оболочке.
  • Теперь вы можете делать что угодно в этом контейнере. (например, запустите touch aaa или установите gjiten )
  • Если вы введете exit в контейнере, вы выйдете из терминала (TTY) в этом контейнере. Поскольку этот терминал был основным процессом этого контейнера, который теперь завершается, контейнер выйдет (= завершит работу ОС внутри контейнера).
  • Ваши данные не потеряны сейчас. Система просто выключена.
  • Если вы сейчас запустите docker ps -a , вы все равно сможете увидеть там свой контейнер. Все изменения остаются в силе; Он просто не работает в данный момент.
  • Теперь вы можете перезапустить контейнер (например, «перезагрузить систему») с помощью docker container start -i [containerID] ( -i для интерактивный).
  • Теперь вы должны быть внутри контейнера.
  • Введите ls , чтобы увидеть, что ваш файл aaa все еще существует.
  • Из другого терминала вы можете запустить docker ps , и он покажет вам текущий запущенный контейнер.

Кстати: обратите внимание, что вам нужно создать контейнер с помощью -it , чтобы использовать -i в начало контейнера докеров -i [containerID]

0
ответ дан 3 January 2021 в 22:47

Вам необходимо создать Dockerfile и создать сценарий для собственного контейнера из существующего образа. Синтаксис выглядит следующим образом:

FROM UBUNTU:LATEST
RUN <some command like apt install>

Вам понадобится RTFM, чтобы понять его полностью, потому что это еще не все. Лучший способ учиться - взглянуть на любой проект, который присутствует как на dockerhub, так и на github. Таким образом вы можете увидеть «готовый продукт», а также способ изготовления контейнера.

HTH немного, s1mmel

Вот живой пример. Это Dockerfile из моего единственного репо, которое я создал некоторое время назад. Сервер Minecraft papermc. Это не поможет вам полностью, но для начала, я думаю, этого достаточно.

Посмотрите

2
ответ дан 3 January 2021 в 22:47

Другие вопросы по тегам:

Похожие вопросы: