Я создал контейнер с -d
таким образом, чтобы он не был интерактивным.
docker run -d shykes/pybuilder bin/bash
Я вижу, что контейнер вышел:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6c45e8cc5f0 shykes/pybuilder:latest "bin/bash" 41 minutes ago Exited (0) 2 seconds ago clever_bardeen
Теперь я хотел бы запускать случайные команды на машине и выходить. Просто чтобы получить ответ.
Я пытался запустить машину. Я пытался прикрепить. Я думал, что могу позвонить run
с контейнером, но это, кажется, не разрешено. Использование start
только кажется, что работает, а затем существует быстро.
Я хотел бы вернуться в интерактивный режим после выхода.
Я старался:
docker attach d6c45e8cc5f0
Но я получаю:
2014/10/01 22:33:34 You cannot attach to a stopped container, start it first
Но если я начну, то все равно выйдет. Поймай 22. Я не могу победить.
docker container ls -a
Ответы:
В октябре 2014 года команда Docker представила
docker exec
команду : https://docs.docker.com/engine/reference/commandline/exec/Теперь вы можете запустить любую команду в работающем контейнере, просто зная его идентификатор (или имя):
Обратите внимание, что
exec
команда работает только на уже запущенном контейнере. Если контейнер в данный момент остановлен, вам необходимо сначала запустить его с помощью следующей команды:Самым важным здесь является
-d
вариант, который обозначаетdetached
. Это означает, что команда, которую вы изначально предоставили контейнеру (/bin/bash
), будет выполняться в фоновом режиме, и контейнер не остановится немедленно .источник
CDR LDN
доcdrev
ответа ниже ( stackoverflow.com/a/26181666/149428 ).-it
?Ваш контейнер будет выходить в качестве команды , вы дали это закончится. Используйте следующие параметры, чтобы сохранить его:
-i
Держите STDIN открытым, даже если он не подключен.-t
Выделяют псевдо-TTY.Итак, ваша новая
run
команда:Если вы хотите присоединить к уже запущенному контейнеру:
В этих примерах
/bin/bash
используется как команда.источник
docker exec -it CONTAINER_ID /bin/bash -c "export VAR=1 && echo $VAR"
и печатал пустую переменную (ожидается1
). Что мне не хватает?-it
он недоступен.Поэтому я думаю, что ответ проще, чем многие вводящие в заблуждение ответы выше.
Чтобы запустить существующий контейнер, который остановлен
Чтобы остановить работающий контейнер
Затем войти в интерактивную оболочку контейнера
Чтобы запустить существующий контейнер и присоединить к нему одной командой
Осторожно, это остановит контейнер при выходе. Но в целом вам нужно запустить контейнер, прикрепить и остановить его после того, как вы закончите.
источник
Чтобы расширить ответ katrmr, если контейнер остановлен и не может быть запущен из-за ошибки, вам нужно сделать
commit
это с изображением. Затем вы можете запустить bash в новом образе:источник
dshell
для ее автоматического выполнения в различных ситуациях - github.com/avirshup/docker-cli-sugarНекоторые из ответов здесь вводят в заблуждение, потому что они касаются контейнеров, которые работают, а не останавливаются.
Свен Давидейт объяснил на форуме Docker, что контейнеры связаны с их процессом (и Docker не может изменить процесс остановленного контейнера, по-видимому, по крайней мере, из-за его внутренней структуры: https://github.com/docker/docker/issues / 1437 ). Таким образом, в основном, единственная опция -
commit
это контейнер с изображением иrun
другой командой.См. Https://forums.docker.com/t/run-command-in-stopped-container/343
(я считаю, что
ENTRYPOINT
подход « с аргументами» тоже не сработает, поскольку вы все равно не сможете изменить аргументы к остановленному контейнеру.)источник
bin/bash
без-it
изменений ничего не изменит в контейнере, поэтому его фиксация на самом деле не нужна, и CDR LDN дает правильный ответ для конкретной ситуации OP. Тем не менее,commit
это ответ на техническую проблему, как изменить контейнерный процесс.Мне пришлось использовать bash -c для запуска моей команды:
docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"
источник
Создание контейнера и отправка ему команд, одна за другой:
источник
Это комбинированный ответ, который я составил, используя ответ CDR LDN выше и ответ, который я нашел здесь .
В следующем примере контейнер Arch Linux запускается из образа, а затем устанавливается
git
в этот контейнер с помощьюpacman
инструмента:Это все.
источник
Если вы пытаетесь запустить скрипт оболочки, вам нужно запустить его как bash.
источник
Передайте команду на стандартный ввод
Необходимо удалить,
-t
чтобы это работало:Это может быть более удобным, чем использование параметров CLI.
Протестировано с:
затем на другой оболочке:
Затем на первой оболочке:
Протестировано на Docker 1.13.1, хост Ubuntu 16.04.
источник
Предполагая, что образ использует точку входа по умолчанию
/bin/sh -c
, запуск/bin/bash
немедленно завершится в режиме демона (-d
). Если вы хотите, чтобы этот контейнер запускал интерактивную оболочку, используйте-it
вместо-d
. Если вы хотите выполнить произвольные команды в контейнере, обычно выполняющем другой процесс, вы можете попробоватьnsenter
илиnsinit
. Посмотрите https://blog.codecentric.de/en/2014/07/enter-docker-container/ для деталей.источник
К сожалению, невозможно переопределить
ENTRYPOINT
аргументыdocker run --entrypoint
для достижения этой цели.источник
Я хотел бы отметить, что верхний ответ немного вводит в заблуждение.
Проблема с выполнением
docker run
заключается в том, что каждый раз создается новый контейнер. Однако есть случаи, когда мы хотели бы вернуться к старым контейнерам или не занять место с новыми контейнерами.(Дано
clever_bardeen
имя созданного контейнера ...)В случае OP убедитесь, что образ докера сначала запущен, выполнив следующую команду:
Затем выполните контейнер Docker, используя следующую команду:
источник
Для Mac:
если вы хотите подключиться как пользователь root:
источник
Простой ответ: начать и прикрепить одновременно. В этом случае вы делаете именно то, что вы просили.
не забудьте изменить
<CONTAINER_ID/CONTAINER_NAME>
источник
Пример:
источник
Я использую контейнер Windows, и мне нужно искать в контейнере Docker файлы и папки, созданные и скопированные.
Для этого я использовал следующую команду docker entrypoint, чтобы запустить командную строку внутри контейнера или присоединить к контейнеру.
Это помогло мне как присоединить командную строку к контейнеру, так и сохранить контейнер в рабочем состоянии. :)
источник
Я обычно использую это:
постоянно взаимодействовать с работающим контейнером.
источник
Быстрый способ возобновить и получить доступ к недавно вышедшему контейнеру:
источник