Я хотел бы запустить остановленный контейнер Docker с помощью другой команды, так как команда по умолчанию вылетает, то есть я не могу запустить контейнер и затем использовать 'docker exec'.
По сути, я хотел бы запустить оболочку, чтобы я мог проверить содержимое контейнера.
К счастью, я создал контейнер с опцией -it!
inspect
выходные данные в конфигурацию, которая используется при последующем запуске?Отредактируйте этот файл (соответствующий вашему остановленному контейнеру):
Измените параметр «Path», чтобы он указывал на вашу новую команду, например / bin / bash. Вы также можете установить параметр «Args» для передачи аргументов в команду.
Перезапустите службу Docker (обратите внимание, что это остановит все запущенные контейнеры):
Перечислите ваши контейнеры и убедитесь, что команда изменилась:
Запустите контейнер и прикрепите к нему, теперь вы должны быть в вашей оболочке!
Работал на Fedora 22 с использованием Docker 1.7.1.
ПРИМЕЧАНИЕ. Если ваша оболочка не является интерактивной (например, вы не создали оригинальный контейнер с параметром -it), вместо этого вы можете изменить команду на «/ bin / sleep 600» или «/ bin / tail -f / dev / null» чтобы дать вам достаточно времени, чтобы сделать "docker exec -it CONTID / bin / bash" как еще один способ получения оболочки.
ПРИМЕЧАНИЕ 2. В более новых версиях Docker есть файл config.v2.json, в котором вам нужно будет изменить либо Entrypoint, либо Cmd (спасибо user60561).
источник
..."Path":"tail","Args":["-f","/dev/null"]...
config.v2.json
, где вам нужно будет изменить либоEntrypoint
илиCmd
.Добавьте проверку в начало вашего скрипта Entrypoint
Docker действительно должен реализовать это как новую функцию, но вот еще один вариант обходного пути для ситуаций, в которых у вас есть точка входа, которая завершается после успеха или сбоя, что может затруднить отладку.
Если у вас еще нет сценария Entrypoint, создайте тот, который выполняет все команды, которые вам нужны для вашего контейнера. Затем в верхней части этого файла добавьте эти строки в
entrypoint.sh
:Чтобы убедиться, что
cat
соединение удерживается, вам может потребоваться предоставить TTY. Я запускаю контейнер с моим скриптом Entrypoint следующим образом:Это приведет к тому, что скрипт будет запущен один раз, создав файл, который указывает, что он уже запущен (в виртуальной файловой системе контейнера). Затем вы можете перезапустить контейнер для выполнения отладки:
Когда вы перезапустите контейнер,
already_ran
файл будет найден, в результате чего скрипт Entrypoint остановитсяcat
(который просто вечно ожидает ввода, который никогда не поступит, но сохраняет контейнер живым). Затем вы можете выполнитьbash
сеанс отладки :Во время работы контейнера вы также можете удалить
already_ran
и вручную запуститьentrypoint.sh
сценарий для его повторного запуска, если вам необходимо выполнить отладку таким способом.источник
/bin/sh
вместоcat
- тогда вы всегда можете войти, просто перезапустившись. Ваше решение ошеломляет!Моя проблема:
docker run <IMAGE_NAME>
docker ps -a
я мог видеть два контейнера.docker run <IMAGE_NAME>
команду, создавался новый образРешение. Для работы с тем же контейнером, который вы создали в первую очередь, выполните следующие действия.
docker ps
получить контейнер вашего контейнераdocker container start <CONTAINER_ID>
запустить существующий контейнерdocker exec -it <CONTAINER_ID> /bin/bash
источник
docker run <containerID>
Я взял ответ @ Dmitriusan и превратил его в псевдоним:
Добавьте это в свой
~/.bashrc
файл псевдонимов, и у вас будет отличный новыйdocker-run-prev-container
псевдоним, который поместит вас в оболочку в предыдущем контейнере.Полезно для отладки не удалось
docker build
s.источник
Это не совсем то, что вы просите, но вы можете использовать
docker export
остановленный контейнер, если вам нужно только проверить файлы.источник
Не было указано, выходит ли контейнер, только то, что ваш код падает, и вам нужно посмотреть, что происходит в контейнере. Если это не выход, вот еще одно потенциальное решение.
Получить идентификатор контейнера с
docker ps
docker exec -it 665b4a1e17b6 /bin/sh
Если точка входа настроена на что-то проблематичное, она также может быть переопределена, как предлагается в ответе Дмитриусана. Следует также отметить, что вы можете прикрепить к любому работающему контейнеру с помощью
docker attach
. Так много решений, разные решения. Я просто не вижу необходимости фиксировать изображение. Это кажется ненужным.Документы для Docker exec - https://docs.docker.com/engine/reference/commandline/exec/
Документы для прикрепления Docker - https://docs.docker.com/engine/reference/commandline/attach/
источник
Я на самом деле не согласен с обоими этими ответами. Если вы просто хотите увидеть, что находится в контейнере, вы можете запустить эту команду, чтобы получить оболочку. Не нужно менять точку входа вообще или какие-либо конфиги.
источник
docker logs <container_id> --follow
передавать логи в stdout и дать вам то, что вам нужно. Другой вариант - использовать указанную выше команду, а затем запустить службу аварийного завершения для этого образа с той же командой в файле docker и выполнить отладку оттуда.источник