Вопрос или проблема
Я удалил docker-compose, не отправив его в git… Я знаю, что я идиот. Стек все еще активен, так что есть ли способ восстановить этот docker-compose? Я могу выполнить docker inspect и увидеть все необходимые мне элементы, т.е. используемые тома, переменные и т.д., но если есть какой-то трюк, чтобы восстановить compose с минимальными усилиями, это было бы здорово.
Спасибо,
Сначала вам нужно получить эквивалентную команду docker run
, вы можете использовать этот инструмент для этого: https://github.com/nexdrew/rekcod.
После того как у вас будет команда docker run
, вы можете использовать этот другой инструмент, чтобы преобразовать её в файл docker-compose: https://composerize.com/.
Например:
У меня есть следующий файл docker-compose
:
version: '2'
services:
logstash:
image: docker.elastic.co/logstash/logstash:5.6.3
ports:
- 9600:9600
volumes:
- ./pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- ./config/:/usr/share/logstash/config
Я запускаю docker-compose up
и в итоге получаю следующий контейнер:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5febb7edb627 docker.elastic.co/logstash/logstash:5.6.3 "/usr/local/bin/dock…" 2 minutes ago Up 2 minutes 5044/tcp, 0.0.0.0:9600->9600/tcp logstash563_logstash_1
Затем я генерирую эквивалентную команду docker run
для основного контейнера:
$ rekcod 5febb7edb627
docker run --name logstash563_logstash_1 -v /workplace/mariodes/docker/logstash/logstash-5.6.3/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:rw -v /workplace/mariodes/docker/logstash/logstash-5.6.3/config:/usr/share/logstash/config:rw -p 9600:9600/tcp --net logstash563_default --restart no -h 2392ddc1cea7 --expose 5044/tcp --expose 9600/tcp -e 'PATH=/usr/share/logstash/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' -e 'ELASTIC_CONTAINER=true' -e 'LANG=en_US.UTF-8' -e 'LC_ALL=en_US.UTF-8' -d --entrypoint "/usr/local/bin/docker-entrypoint" docker.elastic.co/logstash/logstash:5.6.3
Теперь скопируйте вывод из rekcod и используйте его на https://composerize.com/ для преобразования в файл docker-compose:
version: 3
services:
logstash:
container_name: logstash563_logstash_1
volumes:
- '/workplace/mariodes/docker/logstash/logstash-5.6.3/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:rw'
- '/workplace/mariodes/docker/logstash/logstash-5.6.3/config:/usr/share/logstash/config:rw'
ports:
- '9600:9600/tcp'
restart: no
expose:
- 5044/tcp
- 9600/tcp
environment:
- 'PATH=/usr/share/logstash/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
- ELASTIC_CONTAINER=true
- LANG=en_US.UTF-8
- LC_ALL=en_US.UTF-8
entrypoint:
- /usr/local/bin/docker-entrypoint
image: 'docker.elastic.co/logstash/logstash:5.6.3'
Извините, что поднимаю эту тему, но я только что её нашел, и @Mario Souza нуждается в кофе или пиве или хотя бы в “Отлично! Приятная обратная разработка”.
Поскольку у его ответа всего 1/по умолчанию голос, и у меня нет достаточного авторитета, чтобы проголосовать.
С уважением, nOrphf
Ответ или решение
Для воссоздания файла docker-compose
, который был случайно удален без предварительной отправки в git, но при этом контейнеры все еще работают, вы можете воспользоваться несколькими полезными инструментами и методами. Рассмотрим пошагово, как это сделать.
Шаг 1: Получение параметров запущенного контейнера
Первый шаг — это извлечение информации о работающем контейнере. Вы можете использовать команду docker ps
для отображения всех активных контейнеров. Эта команда покажет вам идентификатор контейнера, имя, используемый образ и другие параметры.
docker ps
Определите CONTAINER ID
нужного контейнера, чтобы просмотреть его детали.
Шаг 2: Использование docker inspect
Теперь, когда вы знаете CONTAINER ID
, вы можете использовать команду docker inspect
, чтобы получить полную информацию о контейнере. Эта информация включает в себя все используемые вами переменные окружения, порты, тома и параметры сети.
docker inspect <CONTAINER ID>
Ищите в выводе параметры в разделе HostConfig
, Config
, а также .Mounts
для томов.
Шаг 3: Получение команды docker run
Для упрощения задачи можно использовать инструмент rekcod. Этот инструмент позволяет получить эквивалентную команду docker run
для вашего контейнера.
Установите rekcod
и выполните следующую команду, подставив CONTAINER ID
:
rekcod <CONTAINER ID>
Вы получите результат в виде команды, которая описывает, как был запущен ваш контейнер, с указанием всех необходимых параметров.
Шаг 4: Конвертация в docker-compose
Как только вы получаете команду docker run
, следующим шагом будет ее конвертация в формат docker-compose
. Для этого прекрасно подойдет инструмент composerize.
Просто скопируйте команду, сгенерированную rekcod
, и вставьте её на сайте composerize. Это преобразует параметры команды docker run
в структуру файла docker-compose
.
Пример
Допустим, вы получили следующую команду docker run
:
docker run --name logstash563_logstash_1 -v /path/to/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -p 9600:9600 -e 'ENV_VAR=value' -d docker.elastic.co/logstash/logstash:5.6.3
После конверсии вы сможете получить следующий файл docker-compose.yml
:
version: '3'
services:
logstash:
container_name: logstash563_logstash_1
image: 'docker.elastic.co/logstash/logstash:5.6.3'
ports:
- '9600:9600'
volumes:
- '/path/to/logstash.conf:/usr/share/logstash/pipeline/logstash.conf'
environment:
- 'ENV_VAR=value'
Заключение
Таким образом, процесс воссоздания файла docker-compose
после его удаления можно сделать с помощью команд docker inspect
и инструментов rekcod и composerize. Это не только спасает ваше время, но и предоставляет возможность восстановить конфигурацию, не теряя никаких важных параметров настройки. Следуйте этим шагам, и вы сможете быстро восстановить вашу инфраструктуру контейнеров.