Как запустить остановленный контейнер Docker с другой командой?
Я хотел бы запустить остановленный контейнер Docker с другой командой, поскольку команда по умолчанию аварийно завершается - это означает, что я не могу запустить контейнер, а затем использовать "docker exec".
В принципе, я хотел бы запустить оболочку, чтобы я мог проверить содержимое контейнера.
К счастью, я создал контейнер с параметром -it!
Ответы
Ответ 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