Автозапуск контейнера docker при старте системы windows

Обновлено: 02.07.2024

Технология Docker набирает всё большую популярность среди разработчиков и DevOps-специалистов в наши дни, поскольку позволяет без особого труда настроить различные окружения один раз, а затем воспроизводить их на, казалось бы, совсем не совместимом оборудовании. Но начнём мы наш цикл статей о Docker с азов.

В сегодняшней статье мы поговорим о создании контейнеров и, соответственно, об их запуске. В Docker контейнер представляет собой окружение для выполнения какого-либо одного процесса. Это изолированная среда, в которой есть всё необходимое для выполнения нужного процесса, и нет ничего лишнего. Создание контейнера Docker выполняется в момент его запуска, и эти процессы запускаются с помощью команды docker run. Давайте сначала рассмотрим её синтаксис и опции.

Синтаксис и опции docker run

Синтаксис команды docker run похож на синтаксис других команд Linux и выглядит следующим образом:

$ docker run опции образ команда

Утилите обязательно надо передать образ, на основе которого будет создан контейнер. Образ может быть локальным или указывать на образ, который надо загрузить из сети. Мы рассмотрим это в примерах ниже. Опции позволяют настроить контейнер и параметры его запуска более детально. Сама команда позволяет переопределить программу, которая выполняется после запуска контейнера. Например, выполнив /bin/bash, вы можете подключится к самому контейнеру.

Рассмотрим основные опции утилиты, которые мы будем использовать. Опций очень много, поэтому я не могу перечислить их все:

  • -d - запускает контейнер в фоновом режиме;
  • -t - прикрепляет к контейнеру псевдо-TTY-консоль;
  • -i - выводит в терминал STDIN поток контейнера;
  • --name - имя контейнера, по которому потом можно будет к нему обращаться;
  • --dns - устанавливает DNS-серверы для контейнера;
  • --network - тип сети для контейнера, может принимать такие значения: bridge (используется по умолчанию), none, host. Также можно передать идентификатор сети Docker, к которой надо подключится;
  • --add-host - добавляет строчку в /etc/hosts;
  • --restart - указывает, когда надо перезапускать контейнер. Возможные значения: no, on-failure, always, unless-stopped;
  • --rm - удаляет контейнер после завершения его работы;
  • -m, --memory - количество оперативной памяти, доступное Docker-контейнеру;
  • --memory-swap - объём памяти раздела подкачки, доступный в контейнере;
  • --cpus - количество ядер процессора, доступных в контейнере;
  • --shm-size - размер файла /dev/shm;
  • --device - позволяет монтировать устройства из папки /dev в контейнер;
  • --entrypoint - позволяет переопределить скрипт, который выполняется при запуске контейнера, перед запуском основной команды;
  • --expose - позволяет пробросить несколько портов из контейнера в хост-систему;
  • -P - пробрасывает все порты контейнера в хост-систему;
  • -p - переносит все порты контейнера в хост-систему без смены номера порта;
  • --link - позволяет настроить связь контейнеров Docker;
  • -e - добавляет переменную окружения в контейнер;
  • -v, --volume - позволяет монтировать папки хоста в контейнер;
  • -w - изменяет рабочую директорию контейнера.

Это основные опции, которые мы будем использовать в этой статье, а теперь давайте рассмотрим на примерах, как создать контейнер Docker в Linux.

Создание контейнера Docker

1. Обычный контейнер

Чтобы создать и запустить контейнер с параметрами, заданными в образе по умолчанию, просто запустите команду без параметров. Давайте воспользуемся контейнером hello-world, который как раз для этого и предназначен:

docker run hello-world


Для поиска уже готовых образов для контейнеров можно использовать веб-сайт DockerHub. Здесь есть образы для большинства дистрибутивов и системных сервисов, таких, как Nginx, Apache, PHP-FPM, PhpMyAdmin и многих других.


Вверху отображается название контейнера, а чуть ниже - доступные версии. При создании контейнера версия записывается через двоеточие. Например, давайте создадим и запустим контейнер с Ubuntu 18.04. Чтобы к контейнеру было легко получить доступ потом, зададим ему имя с помощью опции --name:

docker run --name Ubuntu1804 ubuntu:18.04

2. Подключение к контейнеру

Образ Ubuntu 18.04, на основе которого мы создали контейнер выше, не содержит команды, которая бы постоянно выполнялась, поэтому если вы попытаетесь подключится к нему с помощью команды docker exec, то получите ошибку: You cannot attach to a stopped container, start it first:

docker attach Ubuntu1804


Так происходит потому, что окружение не может работать без основного процесса, для которого и создан контейнер. Пока работает процесс, будет работать и контейнер. Как только процесс завершён, контейнер завершается, и созданный нами ранее контейнер полностью бесполезен. Вы не сможете к нему подключится, потому что он будет падать сразу же после старта, а к упавшему контейнеру подключится нельзя. Его можно удалить:

docker rm Ubuntu1804

А нам надо создать контейнер с командой, которая будет выполняться. Для этого просто передайте команду после имени образа, например /bin/bash. Чтобы контейнер был доступен интерактивно, создавайте его с опциями -i и -t:

docker run -it --name Ubuntu1804 ubuntu:18.04 /bin/bash


Теперь вы в контейнере и можете выполнять действия прямо в изолированном окружении.

3. Переменные окружения

Очень часто для изменения настроек контейнера используются переменные окружения. Вы задаёте какую-нибудь переменную окружения, а затем её значение используется вашей программой в самом контейнере для выполнения различных действий. Для задания переменных окружения используется опция -e. Запуск контейнера Docker:

docker run -it -e "FOO=bar" --name Ubuntu1804_2 ubuntu:18.04 /bin/bash


4. Монтирование папок и хранилищ

Когда вам нужно, чтобы контейнер мог работать с исходными кодами программы или с часто изменяемыми данными, рекомендую сделать специальную настройку - будет неудобно каждый раз копировать информацию в контейнер. Куда проще примонтировать папку хоста в контейнер, и все изменения исходников будут сразу же доступны в контейнере. Это очень удобно. Для монтирования папки следует передать её опции -v. Например, примонтируем папку

/test_docker в контейнер:

docker run -it -v "

/test_docker:/mnt" --name Ubuntu1804_3 ubuntu:18.04 /bin/bash


Хранилища позволяют монтировать в контейнер виртуальный диск, который не удаляется при удалении контейнера. Такое хранилище будет автоматически создано, если передать не существующую папку, а имя для нового хранилища:

docker run -it -v docker_volume:/mnt --rm --name Ubuntu1804_4 ubuntu:18.04 /bin/bash


Напоминаю, что опция --rm удаляет контейнер сразу же после того, как он завершит свою работу. Посмотреть список доступных хранилищ можно командой:

docker volume list


5. Порты контейнера

Если вам нужно получить доступ к какому-либо сервису контейнера по порту, например к веб-интерфейсу, этот порт надо пробросить в хост-систему. Для этого используется опция -p. Давайте установим Nginx и пробросим его порт в хост-систему:

docker run --name Nginx -p 8080:80 -d nginx


6. Связывание контейнеров

Связывание контейнеров позволяет настроить взаимодействие между ними. Связанный контейнер будет доступен по сети по его имени. Соответствующая строчка будет автоматически добавлена в файл /etc/hosts контейнера. Для связывания используется опция --link. Чтобы закрепить знания, полученные выше, давайте создадим контейнер с базой данных MySQL, а затем свяжем его с PhpMyAdmin.

Сначала создаём контейнер MySQL с постоянным хранилищем в /var/lib/mysql. В переменных окружения ему надо передать пароль суперпользователя. Какие переменные окружения ожидает получить контейнер - эту информацию обычно можно найти на странице контейнера на DockerHub. Используйте опцию -d, чтобы контейнер запустился в фоновом режиме:

docker run -v mysql_volume:/var/lib/mysql --name MySQL -e MYSQL_ROOT_PASSWORD=passwd -d mysql:8.0


Затем создаём контейнер с PhpMyAdmin для доступа к этой базе данных и связываем с ним контейнер MySQL под именем db:

docker run --name PhpMyAdmin -d --link MySQL:db -p 8080:80 phpmyadmin/phpmyadmin

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


7. Сеть для контейнеров

Контейнеры можно не связывать. Если надо объединить три и больше контейнеров между собой, то куда удобнее сразу связать их в одну общую сеть, чем создавать множество подключений для каждого из этих контейнеров. Все объекты в одной сети будут иметь доступ к друг другу по их имени. Сначала необходимо создать сеть:

docker network create -d bridge docker_network

Посмотреть список созданных сетей можно командой:

docker network list


Теперь можно её использовать. Объединим с помощью сети наш MySQL- и PhpMyAdmin-сервера. Для этого надо их остановить и удалить:

docker stop MySQL
docker stop PhpMyAdmin

docker rm MySQL
docker rm PhpMyadmin

docker run -v mysql_volume:/var/lib/mysql --network docker_network --name MySQL -e MYSQL_ROOT_PASSWORD=passwd -d mysql:8.0

А для PhpMyAdmin теперь надо передать хост, на котором расположена база данных в переменной окружения PMA_HOST:

docker run --name PhpMyAdmin -d --network docker_network -e PMA_HOST=MySQL -p 8080:80 phpmyadmin/phpmyadmin


Выводы

В этой статье мы рассмотрели, как запустить контейнер Docker и настроить его параметры. Как видите, Docker может быть очень полезным для быстрого разворачивания рабочих окружений. Но редко для этих целей используют саму команду docker run. Обычно используется инструмент docker-compose. Интересно ли вам прочитать об этом инструменте? Напишите в комментариях!

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Подсистема и клиент Docker не входят в состав Windows, потому их нужно устанавливать и настраивать отдельно. Кроме того, подсистема Docker может принимать множество пользовательских конфигураций. Например, можно настроить то, как управляющая программа принимает входящие запросы, сетевые параметры по умолчанию и параметры ведения журнала и отладки. В ОС Windows эти конфигурации можно указать в файле конфигурации или с помощью диспетчера служб Windows. В этом документе объясняется установка и настройка подсистемы Docker; также представлены примеры некоторых часто используемых конфигураций.

Установка Docker

Для работы с контейнерами Windows требуется Docker. Docker состоит из подсистемы Docker (dockerd.exe) и клиента Docker (docker.exe). Самый простой способ установить все необходимые компоненты изложен в кратком руководстве, которое поможет настроить и запустить первый контейнер.

Сведения об установке с помощью сценария см. в разделе Использование сценария для установки Docker EE.

Прежде чем использовать Docker, необходимо установить образы контейнеров. Дополнительные сведения см. в документации по образам контейнеров.

Настройка Docker с помощью файла конфигурации

Предпочтительным способом настройки подсистемы Docker в Windows является использование файла конфигурации. Путь к файлу конфигурации — C:\ProgramData\Docker\config\daemon.json. Если этот файл еще не существует, его можно создать.

Не все доступные параметры конфигурации Docker применяются к Docker в Windows. В примере ниже показаны параметры конфигурации, которые применяются. Дополнительные сведения о конфигурации подсистемы Docker см. в статье Docker daemon configuration file (Файл конфигурации управляющей программы Docker).

Достаточно только внести необходимые изменения в файл конфигурации. Например, в этом случае подсистема Docker настраивается на прием входящих подключений через порт 2375. В других параметрах конфигурации будут использоваться значения по умолчанию.

Аналогично в примере ниже настраивается хранение образов и контейнеров по альтернативному пути в управляющей программе Docker. Если оно не указано, по умолчанию используется значение c:\programdata\docker .

В примере ниже управляющая программа Docker настраивается на прием только защищенных подключений через порт 2376.

Настройка Docker в службе Docker

Подсистему Docker можно также настроить, изменив службу Docker командой sc config . При использовании этого способа флаги подсистемы Docker задаются непосредственно в службе Docker. Выполните указанную ниже команду в командной строке (cmd.exe, не PowerShell).

Не нужно выполнять эту команду в том случае, если файл daemon.json уже содержит запись "hosts": ["tcp://0.0.0.0:2375"] .

Распространенные конфигурации

В следующих примерах файла конфигурации представлены распространенные конфигурации Docker. Их можно объединить в один файл конфигурации.

Создание сети по умолчанию

Чтобы настроить подсистему Docker таким образом, чтобы не была создана сеть NAT по умолчанию, используйте следующую конфигурацию.

Дополнительные сведения см. в статье Управление сетями Docker.

Задание группы безопасности для Docker

После входа в систему на узле Docker и запуска команд Docker эти команды выполняются через именованный канал. По умолчанию только члены группы "Администраторы" могут получить доступ к подсистеме Docker через именованный канал. Чтобы указать группу безопасности, имеющую такой доступ, используйте флаг group .

Конфигурация прокси-сервера

После задания переменной перезапустите службу Docker.

Удаление Docker

В этом разделе описывается, как удалить Docker и выполнить полную очистку компонентов системы Docker в Windows 10 или Windows Server 2016.

Все команды в этих инструкциях необходимо выполнять из сеанса PowerShell с повышенными привилегиями.

Подготовка системы к удалению Docker

Перед удалением Docker убедитесь, что в системе не запущены контейнеры.

Выполните следующие командлеты, чтобы найти работающие контейнеры:

Кроме того, перед удалением Docker рекомендуется удалить все контейнеры, образы контейнеров, сети и тома из системы. Это можно сделать, выполнив следующий командлет:

Удаление Docker

Затем необходимо начать собственно удаление Docker.

Удаление Docker в Windows 10

  • На компьютере с Windows 10 перейдите в раздел Параметры > Приложения.
  • В разделе Приложения и компоненты найдите пункт Docker для Windows
  • Последовательно выберите Docker для Windows > Удалить.

Удаление Docker в Windows Server 2016

В сеансе PowerShell с повышенными привилегиями используйте командлеты Uninstall-Package и Uninstall-Module, чтобы удалить модуль Docker и соответствующий ему поставщик Управление пакетами из системы, как показано в следующем примере:

Вы можете найти поставщик пакетов, который использовался для установки Docker с помощью команды PS C:\> Get-PackageProvider -Name *Docker*

Очистка данных и системных компонентов Docker

После удаления Docker необходимо удалить сети Docker по умолчанию, чтобы их конфигурация не оставалась в системе после того, как Docker будет удален. Это можно сделать, выполнив следующий командлет:

Удалите сети по умолчанию Docker в Windows Server 2016.

Выполните следующий командлет, чтобы удалить программные данные Docker из системы:

Можно также удалить необязательные компоненты Windows, связанные с Docker и контейнерами в Windows.

К ним относится компонент "Контейнеры", который автоматически включается в любом экземпляре Windows 10 или Windows Server 2016 при установке Docker. Это также может быть компонент «Hyper-V», который автоматически включается в Windows 10 при установке Docker, однако в Windows Server 2016 он включается вручную.

Компонент Hyper-V является общим компонентом виртуализации, который обеспечивает гораздо большую функциональность, чем при использовании одних только контейнеров. Прежде чем отключить Hyper-V, убедитесь, что в системе нет других виртуальных компонентов, которые зависят от Hyper-V.

Удаление компонентов Windows 10

Удаление компонентов Windows Server 2016

В сеансе PowerShell с повышенными привилегиями выполните следующие командлеты, чтобы отключить компоненты Контейнеры и (необязательно) Hyper-V.

Перезагрузка системы

Чтобы завершить удаление компонентов и очистить систему, выполните следующий командлет из сеанса PowerShell с повышенными привилегиями для перезагрузки системы:

Требуется настроить автозапуск всех имеющихся контейнеров в системе после перезагрузки ОС.

Пробую вот так:
vi /etc/systemd/system.conf
Добавляю


Но после reboot контейнеры так и не стартуют.
Второй момент, какой самый простой способ чтобы добавить в portainer поддержку ssl/tls ? Так как пароли он выводит в отрытом виде, это же просто жесть.

  • Вопрос задан более года назад
  • 7544 просмотра

Простой 1 комментарий

OnYourLips

1. sudo docker run --restart=always -d your_image
2. Забайндить его на локалхост. Ходить через ssh туннель.

Еще вопрос, к примеру я в docker-compose поднимаю сервер СУБД и хочу что бы в нем крутились сразу 3-5 баз данных а не одна как например:


.
db:
image: mysql:5.7
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=root
- MYSQL_PASSWORD=root
- MYSQL_DATABASE=dbname
- MYSQL_DATABASE=test
networks:
- gitea
volumes:
- /var/lib/docker/volumes/mysql:/var/lib/mysql

Понятно что можно просто запустить еще один сервер на другом порту но мне кажется что должно быть более умное решение.

OnYourLips

HexUserHex, если они для разных сервисов, то можно их поднять в разных сетях.

но в любом случае в своем .yml я получу по сути дублирущийся код


db:
image: mysql:5.7
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=root
- MYSQL_PASSWORD=root
- MYSQL_DATABASE=dbname
- MYSQL_DATABASE=test
networks:
- gitea
volumes:
- /var/lib/docker/volumes/mysql:/var/lib/mysql

db2:
image: mysql:5.7
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=root
- MYSQL_PASSWORD=root
- MYSQL_DATABASE=dbname
- MYSQL_DATABASE=test
networks:
- gitea
volumes:
- /var/lib/docker/volumes/mysql:/var/lib/mysql

OnYourLips

Для запуска контейнеров не надо трогать демон Докера. Дело в том, что сам докер не знает что вам надо поднимать после ребута, а что нет и надо ему просто указать на это. К тому же, одни контейнеры нужно поднимать, а другие нет. Поэтому нет смысла поднимать все, надо просто при запуске указать дополнительный флаг для контейнеров, которые должны быть подняты. Например, контейнер запускается такой командой:
docker run my-container

Для перезапуска добавьте --restart=>, например:
docker run --restart=always my-container

Подробнее о вариантах перезапуска в документации

Еще вопрос, к примеру я в docker-compose поднимаю сервер СУБД и хочу что бы в нем крутились сразу 3-5 баз данных а не одна как например:

Понятно что можно просто запустить еще один сервер на другом порту но мне кажется что должно быть более умное решение.

И все нормально. Есть ли встроенный способ запустить контейнер таким образом, чтобы он автоматически перезапускался в случае сбоя и перезагрузки системы?

Если да, доступно ли это также в Docker Compose?

Да, в докере есть политики перезапуска, например > который справится с этим. Он также доступен в файле конфигурации compose.yml как >.

Чтобы запустить контейнер и настроить его на автоматический перезапуск при перезагрузке системы, используйте

Где ecstatic_ritchie - это пример имени, определяющий интересующий контейнер. Используйте docker ps -a , чтобы перечислить все имена контейнеров.

Чтобы определенные запущенные контейнеры запускались автоматически при перезагрузке системы

Чтобы все запущенные контейнеры запускались автоматически при перезагрузке системы

Дополнительные сведения см. На главной странице Docker

У меня аналогичная проблема с системами Linux. После загрузки системы контейнер с политикой перезапуска «если-не остановлен» не будет перезапускаться автоматически, если я не введу команду, которая каким-либо образом использовала докер, например «docker ps». Я был удивлен, поскольку ожидал, что эта команда просто сообщит некоторую информацию о состоянии. Затем я попробовал команду «systemctl status docker». В системе, где не выполнялись никакие команды докеров, эта команда сообщала следующее:

В системе, где docker ps запускался без других команд Docker, я получил следующее:

Наиболее вероятное объяснение состоит в том, что Docker ждет некоторой команды docker перед полной инициализацией и запуском контейнеров. Предположительно, вы могли бы запустить «docker ps» в файле модуля systemd в момент после того, как все службы, необходимые вашим контейнерам, были инициализированы. Я проверил это, поместив файл с именем docker-onboot.service в каталог / lib / systemd / system со следующим содержимым:

Пока (один тест, с включенной этой службой) контейнер запускался при загрузке компьютера. Я не пробовал использовать зависимость от docker.service, потому что docker.service не запускается, пока не будет запущена команда docker. Следующий тест будет с отключенным docker-onboot (чтобы узнать, запустит ли его автоматически зависимость WantedBy).

Вы можете запустить контейнер, который перезапускается всегда:

Если вы хотите изменить конфигурацию работающего контейнера, вам следует обновить его:

И если вы хотите увидеть текущую политику контейнера, сначала выполните следующую команду перед указанным выше:

В конце концов, не забудьте включить установленный демон докера при загрузке системы :

Чтобы увидеть полный список политик перезапуска, см. Политики перезапуска

Я хотел добиться запуска контейнера при загрузке в Windows.

Поэтому я просто создал запланированную задачу, которая запускается при загрузке системы. Эта задача просто запускает «Docker для Windows.exe» (или как там называется исполняемый файл вашего докера).

Затем запустятся все контейнеры с политикой перезапуска «всегда».

Вот для чего нужен crontab:

Получите доступ к своему пользовательскому crontab с помощью crontab -e или покажите его с помощью crontab -l или отредактируйте системный crontab на /etc/crontab

Более «щадящий» режим из документации:

1) Прежде всего, вы должны включить службу докеров при загрузке

2) Затем, если у вас есть файл .yml для создания докеров, добавьте restart: always или если у вас есть контейнер для докеров, добавьте restart = always следующим образом:

docker run --restart=always и запустите контейнер докеров

Если вы остановите контейнер вручную, его политика перезапуска игнорируется, пока демон Docker не перезапустится или контейнер не будет перезапущен вручную.

См. эту политику перезапуска на официальной странице Docker

3) Если вы хотите запустить docker-compose, все службы запускаются при перезагрузке системы, поэтому вы запускаете команду ниже только один раз

Вы можете использовать docker update --restart=on-failure <container ID or name> .

Помимо того, что следует из названия, on-failure перезапускает контейнер не только в случае сбоя, но и при загрузке системы.

Согласно документации, существует несколько вариантов перезапуска:

Для созданных контейнеров используйте docker update для обновления политики перезапуска.

0576df221c0b - это идентификатор контейнера.

Если вы хотите, чтобы контейнер запускался, даже если ни один пользователь не выполнил вход в систему (например, виртуальная машина VirtualBox, которую я только запускаю и не хочу входить каждый раз). Вот шаги, которые я выполнил для Ubuntu 16.04 LTS. В качестве примера я установил контейнер oracle db:

я настраиваю простой образ: тот, который содержит Riak (база данных NoSQL). Изображение запускает службу Riak с помощью riak start как CMD. Теперь, если я запущу его как демон с docker run -d quintenk/riak-dev , он запускает процесс Riak (я вижу это в журналах). Однако через несколько секунд она автоматически закрывается. Если я запускаю его с помощью docker run -i -t quintenk/riak-dev /bin/bash процесс riak не запущен (обновление: см. ответы для объяснения этого). Фактически, никакие службы не работают вообще. Я могу запустить его вручную с помощью терминала, но Я бы хотел, чтобы РИАК начал автоматически. Я полагаю, что такое поведение будет происходить и для других служб, Riak-просто пример.

Итак, запуск / перезапуск контейнера должен автоматически запустить Riak. Каков правильный подход к этому?

для справки, вот Докерфайл, с помощью которого можно создать изображение (обновление: изменено с помощью выбранного ответа):

EDIT: - F изменен на-F в CMD в соответствии с sesm его замечание

чтобы контейнеры docker продолжали работать, необходимо поддерживать активный процесс на переднем плане.

поэтому вы, вероятно, можете заменить эту последнюю строку в своем Dockerfile на

обратите внимание, что вы не можете иметь несколько строк инструкций CMD, только последний запускается.

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

лучшее решение-использовать руководитель. Взгляните на это учебник о запуске Riak в контейнере Docker.

если я запускаю его с помощью docker run -i -t quintenk/riak-dev /bin/bash процесс riak не запущен

выглядит следующим образом. Использование CMD в Dockerfile фактически является той же функциональностью, что и запуск контейнера с помощью docker run . Как заметил Гигаблах, используется только последний CMD, поэтому в этом случае перезаписывается написанный в Dockerfile.

С помощью CMD /bin/riak start && tail -f /var/log/riak/erlang.log.1 в Buildfile, вы можете запустить контейнер в качестве фонового процесса с использованием docker run -d , который работает как шарм.

"если я запускаю его с помощью docker run-i-t quintenk/riak-dev /bin/bash, процесс riak не запускается"

похоже, вы хотите только иметь возможность контролировать журнал при подключении к контейнеру. Мой вариант использования немного отличается тем, что я хочу, чтобы команды запускались автоматически, но я хочу иметь возможность прикрепляться к контейнеру и быть в оболочке bash. Я смог решить обе наши проблемы следующим образом:--7-->

в образе/контейнере добавьте команды, которые вы хотите автоматически запускаются до конца .

в вашем случае просто добавьте строку /bin/riak start && tail -F /var/log/riak/erlang.log.1 , или put /bin/riak start и tail -F /var/log/riak/erlang.log.1 на отдельной линии в зависимости от требуемой функциональности.

теперь зафиксируйте изменения в контейнере и запустите его снова с помощью: docker run -i -t quintenk/riak-dev /bin/bash . Вы найдете команды, которые вы помещаете в bashrc, уже запущены по мере присоединения.

потому что я хочу чистый способ выхода процесса позже, я делаю последнюю команду вызовом оболочки read что заставляет этот процесс блокировать, пока я позже не присоединюсь к нему и нажмите enter.

как вы можете видеть выходы контейнера после присоединения к нему и разблокирования чтения. Конечно, вы можете использовать более сложный скрипт, чем read -p Если вам нужно сделать другую очистку, например, остановить службы и сохранить журналы и т. д.

Я использую простой трюк, когда я начинаю строить новый контейнер docker. Чтобы сохранить его, я использую ping в скрипте entrypoint.

поэтому в Dockerfile, например, при использовании debian, я удостоверяюсь, что могу пинговать. Это кстати, всегда приятно, чтобы проверить, что доступно из контейнера.

и в entrypoint.sh файл

Я использую это вместо CMD bash , поскольку я всегда использую загрузочный файл.

Читайте также: