Я наивно ожидал, что эта команда запустит оболочку bash в работающем контейнере:
docker run "id of running container" /bin/bash
похоже, что это невозможно, я получаю сообщение об ошибке:
2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842
Итак, если я хочу запустить bash shell в работающем контейнере (например, в целях диагностики)
я должен запустить SSH сервер и войти через ssh?
docker run CONTAINER
планируется в 1.0docker attach container_name
Ответы:
РЕДАКТИРОВАТЬ: Теперь вы можете использовать
docker exec -it "id of running container" bash
( док )Ранее ответ на этот вопрос был:
Если вам действительно нужно и вы находитесь в среде отладки, вы можете сделать это:
sudo lxc-attach -n <ID>
Обратите внимание, что идентификатор должен быть полным (docker ps -notrunc
).Тем не менее, я настоятельно рекомендую против этого.
уведомление:
-notrunc
устарело, скоро будет заменено--no-trunc
.источник
lxc-attach
должен нормально работать. Я только что проверил дважды, и это работает для меня. (Обратите внимание, что он не будет работать с ядром до 3.8).docker -d -e lxc
docker run -v /var/log/nginx -name somename imagename command
; 2) запустить другой контейнер для просмотра содержимого тома данных:docker run -volumes-from somename -i -t busybox /bin/sh
.В докере 1.3 появилась новая команда
docker exec
. Это позволяет вам войти в работающий докер:источник
docker ps
чтобы получить идентификатор запущенных экземпляровdocker inspect <image>
чтобы увидеть, какая оболочка доступна. Например, бегиdocker exec -it <container id> /bin/sh
вместо этого.Просто сделать
Как уже упоминалось в комментариях, чтобы отсоединиться от контейнера, не останавливая его, введите Ctrlpзатем Ctrlq.
источник
docker attach container_name
использоватьctrl p
иctrl q
вместоexit
.exit
команда останавливает контейнер, где , какctrlp
иctrl q
просто отрывает этот контейнер и держит это работаетТак как вещи накапливаются, на данный момент используется рекомендуемый способ доступа к работающему контейнеру
nsenter
.Вы можете найти больше информации об этом github-хранилище . Но в целом вы можете использовать nsenter следующим образом:
или вы можете использовать обертку
docker-enter
:Хорошее объяснение по этой теме можно найти в записи блога Жерома Петаццони: почему вам не нужно запускать sshd в ваших док-контейнерах
источник
source /proc/*/environ
.Первое, что вы не можете запустить
Потому что эта команда ожидает изображение, а не контейнер, и это в любом случае приведет к появлению нового контейнера (поэтому не тот, на который вы хотели посмотреть)
Я согласен с тем фактом, что с докером мы должны заставить себя думать по-другому (поэтому вы должны найти способы, чтобы вам не нужно было входить в контейнер), но я все же считаю это полезным, и именно так я работаю вокруг него.
Я запускаю свои команды через супервизора в режиме DEAMON.
Затем я выполняю то, что я называю
docker_loop.sh
. Содержание в значительной степени таково:Что он делает, так это то, что он позволяет вам «прикрепиться» к контейнеру и получить
supervisorctl
интерфейс для остановки / запуска / перезапуска и проверки журналов. Если этого не достаточно, вы можетеCtrl+D
заскочить в оболочку, которая позволит вам взглянуть вокруг, как если бы это была обычная система.ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, ПРИНИМАЙТЕ ВНИМАНИЕ, что эта система не так безопасна, как контейнер без оболочки, поэтому примите все необходимые меры для защиты вашего контейнера.
источник
Следите за этим запросом на получение доступа: https://github.com/docker/docker/pull/7409
Который реализует предстоящую
docker exec <container_id> <command>
утилиту. Когда это доступно, должна быть возможность, например, запускать и останавливать службу ssh внутри работающего контейнера.Для этого также
nsinit
необходимо сделать следующее: «nsinit предоставляет удобный способ доступа к оболочке внутри пространства имен запущенного контейнера» , но запускать его выглядит сложно. https://gist.github.com/ubergarm/ed42ebbea293350c30a6источник
docker exec
приземлился в Docker 1.3, так что теперь можно создавать и присоединять новый сеанс оболочки в работающем контейнереТы можешь использовать
источник
На самом деле есть способ иметь оболочку в контейнере.
Предположим, что вы
/root/run.sh
запускаете процесс, менеджер процессов (супервизор) или что-то еще.Создайте
/root/runme.sh
с некоторыми хитростями gnu-screen:Теперь у вас есть демоны на вкладке 0 и интерактивная оболочка на вкладке 1. В
docker attach
любое время вы можете увидеть, что происходит внутри контейнера.Другой совет - создать изображение «комплекта разработки» поверх рабочего образа со всеми необходимыми инструментами, включая этот трюк с экраном.
источник
вот мое решение
часть DOckerfile:
часть "initd.sh"
после построения изображения у вас есть два варианта использования exec и attach:
запуск докера - имя $ CONTAINER_NAME -dt $ IMAGE_NAME
затем
docker exec -it $ CONTAINER_NAME / bin / bash
и использовать
CTRL + D, чтобы отделить
запуск докера - имя $ CONTAINER_NAME -dit $ IMAGE_NAME
затем
докер присоединить $ CONTAINER_NAME
и использовать
CTRL + P и CTRL + Q, чтобы отсоединить
разница между параметрами в параметре -i
источник
Есть два способа.
С прикрепленным
С exec
источник
Если цель состоит в том, чтобы проверить журналы приложения, этот пост показывает запуск tomcat и настройку журнала как части CMD. Журнал tomcat доступен на хосте с помощью 'Docker Logs containerid'.
http://blog.trifork.com/2013/08/15/using-docker-to-efficiently-create-multiple-tomcat-instances/
источник
Полезно назначать имя при запуске контейнера. Вам не нужно ссылаться на container_id.
docker run --name container_name yourimage docker exec -it container_name bash
источник
во-первых, получите идентификатор контейнера желаемого контейнера с помощью
вы получите что-то вроде этого:
Теперь скопируйте этот идентификатор контейнера и выполните следующую команду:
источник
Может быть, вы, как и я, были введены в заблуждение при разработке контейнеров с точки зрения виртуальных машин. Мой совет: старайтесь не делать этого.
Контейнеры, как и любой другой процесс. На самом деле вы можете захотеть «присоединиться» к ним для целей отладки (подумайте о / proc // env или strace -p), но это очень особый случай.
Обычно вы просто «запускаете» процесс, поэтому, если вы хотите изменить конфигурацию или прочитать журналы, просто создайте новый контейнер и убедитесь, что вы записываете журналы вне его, разделяя каталоги, записывая в stdout (чтобы работали журналы докера) или что-то вроде того.
В целях отладки вы можете запустить оболочку, затем код, а затем нажать CTRL-p + CTRL-q, чтобы оставить оболочку нетронутой. Таким образом, вы можете подключить, используя:
Если вы хотите отладить контейнер, потому что он делает что-то, чего вы не ожидали, попробуйте отладить его: /server/596994/how-can-i-debug-a-docker-container -initialization
источник
Нет, это невозможно. Используйте что-то вроде
supervisord
получения ssh-сервера, если это необходимо. Хотя я определенно подвергаю сомнению необходимость.источник