Как запустить остановленный контейнер Docker с другой командой?
Я хотел бы запустить остановленный контейнер Docker с другой командой, так как команда по умолчанию завершает работу - это означает, что я не могу запустить контейнер, а затем использовать "docker exec".
в основном я хотел бы запустить оболочку, чтобы я мог проверить содержимое контейнера.
к счастью, я создал контейнер с опцией-it!
7 ответов:
найдите свой остановленный идентификатор контейнера
docker ps -aзафиксировать остановленный контейнер:
эта команда сохраняет измененное состояние контейнера в новом образе
user/test_imagedocker commit $CONTAINER_ID user/test_imageзапуск/запуск с другой точкой входа:
docker run -ti --entrypoint=sh user/test_imageописание аргумента точки входа: https://docs.docker.com/engine/reference/run/#/entrypoint-default-command-to-execute-at-runtime
Примечание:
шаги выше просто начните остановку контейнер с тем же состоянием файловой системы. Это отлично подходит для быстрого расследования. Но переменные среды, конфигурация сети, присоединенные Тома и другие сотрудники не наследуются, вы должны указать все эти аргументы явно.
шаги для запуска остановленного контейнера были заимствованы отсюда: (последний комментарий) https://github.com/docker/docker/issues/18078
отредактируйте этот файл (соответствующий вашему остановленному контейнеру):
vi /var/lib/docker/containers/923...4f6/config.jsonизмените параметр "путь", чтобы указать на новую команду, например /bin/bash. Вы также можете установить параметр "Args" для передачи аргументов команде.
перезапустите службу docker (обратите внимание, что это остановит все запущенные контейнеры):
service docker restartперечислите ваши контейнеры и убедитесь, что команда изменилась:
docker ps -aзапустите контейнер и прикрепите к нему, теперь вы должны будьте в своей раковине!
docker start -ai mad_brattainработал на Fedora 22 с помощью Docker 1.7.1.
Примечание: если ваша оболочка не является интерактивной (например, вы не создали исходный контейнер с опцией-it), вы можете вместо этого изменить команду на "/bin/sleep 600" или "/bin/tail-f /dev/null", чтобы дать вам достаточно времени для выполнения "docker exec-it CONTID /bin/bash" в качестве другого способа получения оболочки.
добавить чек в верхней части вашего сценария точки входа
Docker действительно должен реализовать это как новую функцию, но вот еще один вариант обхода для ситуаций, в которых у вас есть точка входа, которая завершается после успеха или сбоя, что может затруднить отладку.
если у вас еще нет сценария точки входа, создайте тот, который запускает любые команды, необходимые для вашего контейнера. Затем в верхней части этого файла добавьте следующие строки
entrypoint.sh:# Run once, hold otherwise if [ -f "already_ran" ]; then echo "Already ran the Entrypoint once. Holding indefinitely for debugging." cat fi touch already_ran # Do your main things down hereобеспечить
catудерживает соединение, возможно, Вам потребуется предоставить TTY. Я запускаю контейнер с моим скриптом Entrypoint следующим образом:docker run -t --entrypoint entrypoint.sh image_nameэто приведет к запуску скрипта один раз, создавая файл, который указывает, что он уже запущен (в виртуальной файловой системе контейнера). Затем можно перезапустить контейнер для выполнения отладки:
docker start container_nameпри перезапуске контейнера,
already_ranфайл будет найден, вызывая сценарий точки входа для остановки сcat(который просто ждет вечно ввода, который никогда не придет, но сохраняет контейнер живым). Затем вы можете выполнить отладкуbashсеанс:docker exec -i container_name bashпока контейнер работает, вы также можете удалить
already_ranи вручную запуститьentrypoint.shскрипт для повторного запуска, Если вам нужно отладить таким образом.
Я взял ответ @Dmitriusan и превратил его в псевдоним:
псевдоним докер-бегут-пред-контейнер='prev_container_id="$(докер ПС -Ак | глава -Н1)" && докер фиксации "$prev_container_id" "prev_container/$prev_container_id" && докер запустить -это ... точка входа=Баш "prev_container/$prev_container_id"'
добавьте это в свой
~/.bashrcфайл псевдонимов, и у вас будет отличный новыйdocker-run-prev-containerпсевдоним, который бросит вас в оболочку в предыдущем контейнер.полезно для отладки не
docker builds.
не было указано, выходит ли контейнер, только то, что ваш код аварийно завершает работу, и вам нужно увидеть, что происходит в контейнере. Если он не выходит, вот еще одно потенциальное решение.
получить идентификатор контейнера с
docker ps
docker exec -it 665b4a1e17b6 /bin/shЕсли точка входа установлена на что-то проблематичное, ее также можно переопределить, как предложено в ответе Дмитриусана. Следует также отметить, что вы можете прикрепить к любому работающему контейнер с
docker attach. Так много решений разные решения. Я просто не вижу необходимости привязываться к изображению. Это кажется ненужным.Docs for Docker exec -https://docs.docker.com/engine/reference/commandline/exec/
Docs for Docker attach -https://docs.docker.com/engine/reference/commandline/attach/
Я на самом деле не согласен с обоими этими ответами. Если вы просто хотите увидеть, что находится в контейнере, то вы можете запустить эту команду, чтобы получить оболочку. Нет необходимости менять точку входа вообще или любые конфигурации.
docker run -it <image_name> bash
Comments