Как запустить остановленный контейнер Docker с другой командой?



Я хотел бы запустить остановленный контейнер Docker с другой командой, так как команда по умолчанию завершает работу - это означает, что я не могу запустить контейнер, а затем использовать "docker exec".



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



к счастью, я создал контейнер с опцией-it!

697   7  

7 ответов:

найдите свой остановленный идентификатор контейнера

docker ps -a

зафиксировать остановленный контейнер:

эта команда сохраняет измененное состояние контейнера в новом образе user/test_image

docker 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 build s.

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

получить идентификатор контейнера с 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 container start <CONTAINER_ID>

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

docker run -it <image_name> bash

Comments

    Ничего не найдено.