Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Отредактируйте этот файл (соответствующий вашему остановленному контейнеру):

vi /var/lib/docker/containers/923...4f6/config.json

Измените параметр "Path", чтобы он указывал на вашу новую команду, например /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 "как еще один способ получения оболочки.

ПРИМЕЧАНИЕ 2. В более новых версиях Docker есть файл config.v2.json, в котором вам нужно будет изменить либо Entrypoint, либо Cmd (спасибо user60561).

Ответ 3

Добавьте проверку вверху вашей точки входа script

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

Если у вас еще нет точки входа script, создайте ту, которая выполняет любые команды, необходимые для вашего контейнера. Затем в верхней части этого файла добавьте эти строки в 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. Я запускаю контейнер с моей точкой входа script следующим образом:

docker run -t --entrypoint entrypoint.sh image_name

Это приведет к тому, что script будет запускаться один раз, создав файл, который указывает, что он уже запущен (в виртуальной файловой системе контейнера). Затем вы можете перезапустить контейнер для выполнения отладки:

docker start container_name

При перезагрузке контейнера будет найден файл already_ran, в результате чего точка входа script закроется с помощью cat (который просто ждет навсегда для ввода, который никогда не наступит, но сохраняет контейнер в активном состоянии). Затем вы можете выполнить отладку bash session:

docker exec -i container_name bash

Пока контейнер запущен, вы также можете удалить already_ran и вручную выполнить entrypoint.sh script, чтобы перезапустить его, если вам нужно отлаживать этот путь.

Ответ 4

Запустите команду вручную внутри контейнера докеров.

Я запускаю docker версию 7.03.1-ce, и я не могу найти config.json.

Я пытаюсь отредактировать файл config.v2.json, но он не работает, и мне не нужен метод фиксации, потому что я не хочу создавать новое изображение. Я нахожу альтернативу, выполнив команду вручную внутри контейнера.

Запустите контейнер

docker start <container>

Доступ bash

docker exec -ti <container> bash

Запустить команду вручную

[email protected]<container_id># service <command> start

или

docker exec -d <container> service <command> start 
#Note: run this in another terminal while docker exec is attach.

Ответ 5

Я взял @Dmitriusan ответ и сделал это в псевдоним:

alias docker-run-prev-container = 'prev_container_id = "$ (docker ps -aq | head -n1)" && & && docker commit "$ prev_container_id" "prev_container/$prev_container_id" && & & docker run -it -entrypoint = bash "prev_container/$prev_container_id" '

Добавьте это в свой файл псевдонимов ~/.bashrc, и у вас будет отличный новый псевдоним docker-run-prev-container, который поместит вас в оболочку в предыдущем контейнере.

Недопустимый для отладки docker build s

Ответ 6

Моя проблема:

  • Я запустил контейнер с 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
  • Затем вы можете решить создать новое изображение из него

Ответ 7

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

Получить идентификатор контейнера с помощью 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/

Ответ 8

Это не совсем то, что вы просите, но вы можете использовать docker export в остановленный контейнер, если все, что вам нужно, это проверить файлы.

mkdir $TARGET_DIR
docker export $CONTAINER_ID | tar -x -C $TARGET_DIR

Ответ 9

docker container start <CONTAINER_ID>

Ответ 10

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

docker run -it <image_name> bash