Как отлаживать докернизированную самоотключающуюся программу?
Я пишу образы Docker для сопровождающих пакетов для Debian-подобных дистрибутивов. Эти образы получены из официальных образов соответствующих дистрибутивов, подобных Debian, путем добавления пакетов, необходимых для сопровождения, и запускаются с нескольких полезных подключенных томов, так что различные элементы конфигурации берутся из среды пользователя, а не хранятся в контейнере.
Когда я запускаю оболочку с этого изображения и выполняю apt-src build
чтобы подготовить пакет, операция начинается нормально, но соединение между контейнером и tty необъяснимо разрывается. Изучение состояния контейнера с docker ps -a
показывает, что это Exited (0)
, Это очень странно, поскольку это означает, что что-то заставляет оболочку завершиться во время выполнения ее подкоманды.
Какие шаги могут помочь мне отладить это странное поведение, выяснить, что здесь происходит, и в конечном итоге исправить это?
Команда запуска контейнера
Вот как я запускаю контейнер:
docker run\
--interactive=true\
--tty=true\
--rm=false\
--volume "${maintainer_pkgdir}:${maintainer_docker_pkgdir}"\
--volume "${maintainer_srcdir}:${maintainer_docker_srcdir}"\
--volume "${maintainer_confdir}:${maintainer_docker_confdir}"\
"${maintainer_repository}/${maintainer_image}"
Стенограмма сессии
Сессия состоит из двух команд apt-src install bmake
а также apt-src build bmake
:
% apt-src install bmake
Reading package lists... Done
Building dependency tree
Reading state information... Done
Need to get 544 kB of source archives.
Get:1 http://ftp.debian.org/debian/ unstable/main bmake 20140620-3 (dsc) [1785 B]
Get:2 http://ftp.debian.org/debian/ unstable/main bmake 20140620-3 (tar) [509 kB]
Get:3 http://ftp.debian.org/debian/ unstable/main bmake 20140620-3 (diff) [33.0 kB]
Fetched 544 kB in 0s (681 kB/s)
gpgv: Signature made Tue Sep 16 20:22:02 2014 UTC using RSA key ID 1A2D268D
gpgv: Can't check signature: public key not found
dpkg-source: warning: failed to verify signature on ./bmake_20140620-3.dsc
dpkg-source: info: extracting bmake in bmake-20140620
dpkg-source: info: unpacking bmake_20140620.orig.tar.gz
dpkg-source: info: unpacking bmake_20140620-3.debian.tar.xz
dpkg-source: info: applying 100_makefile.boot.diff
dpkg-source: info: applying 140_multiarch.diff
dpkg-source: info: applying 160_manpage.diff
dpkg-source: info: applying 180_bmake_path_max.diff
% apt-src build bmake
I: Building in /home/anvil/bmake-20140620 ..
dpkg-buildpackage: source package bmake
dpkg-buildpackage: source version 20140620-3
dpkg-buildpackage: source changed by Andrew Shadura <andrewsh@debian.org>
dpkg-buildpackage: host architecture amd64
dpkg-source --before-build bmake-20140620
fakeroot debian/rules clean
dh clean --with=autoreconf
dh_testdir
debian/rules override_dh_auto_clean
make[1]: Entering directory `/home/anvil/bmake-20140620'
/usr/bin/make -f Makefile.boot clean
make[2]: Entering directory `/home/anvil/bmake-20140620'
rm -f arch.o buf.o compat.o cond.o dir.o for.o hash.o job.o main.o make.o make_malloc.o parse.o str.o strlist.o suff.o targ.o trace.o var.o util.o meta.o strlcpy.o lst.lib/lstAppend.o lst.lib/lstAtEnd.o lst.lib/lstAtFront.o lst.lib/lstClose.o lst.lib/lstConcat.o lst.lib/lstDatum.o lst.lib/lstDeQueue.o lst.lib/lstDestroy.o lst.lib/lstDupl.o lst.lib/lstEnQueue.o lst.lib/lstFind.o lst.lib/lstFindFrom.o lst.lib/lstFirst.o lst.lib/lstForEach.o lst.lib/lstForEachFrom.o lst.lib/lstInit.o lst.lib/lstInsert.o lst.lib/lstIsAtEnd.o lst.lib/lstIsEmpty.o lst.lib/lstLast.o lst.lib/lstMember.o lst.lib/lstNext.o lst.lib/lstOpen.o lst.lib/lstRemove.o lst.lib/lstReplace.o lst.lib/lstSucc.o lst.lib/lstPrev.o bmake
make[2]: Leaving directory `/home/anvil/bmake-20140620'
make[1]: Leaving directory `/home/anvil/bmake-20140620'
dh_autoreconf_clean
dh_clean
debian/rules build
1 ответ
Присоединение программы к tty представляется не совсем надежной операцией, а это означает, что она работает только в предположении, что программа использует tty разумно.
Программа su печально известна тем, что злоупотребляет подключением tty, поэтому вместо устранения проблемы проще избежать использования su или любой другой программы, которая злоупотребляет подключением tty.