docker запустить процесс с терминала - PullRequest
0 голосов
/ 08 мая 2020

Выполнить контейнер:

[root@localhost ~]# docker run -it centos:7.7.1908 /bin/bash
[root@79d4ba3a2080 /]# 

Выполнение хоста:

[root@localhost ~]# ps aux|grep /bin/bash
root      10124  0.0  2.7 385800 51548 pts/1    Sl+  14:25   0:00 docker run -it centos:7.7.1908 /bin/bash
root      10155  0.0  0.0  11828  1740 pts/0    Ss+  14:25   0:00 /bin/bash
root      10197  0.0  0.0 112728   976 pts/2    S+   14:27   0:00 grep --color=auto /bin/bash

Просмотр запущенного процесса контейнера fd: запущенный процесс контейнера (stdin, stdout, stderr) указывает на pts / 0.

[root@localhost ~]# ll /proc/10155/fd
total 0
lrwx------ 1 root root 64 May   8 14:25 0 -> /dev/pts/0
lrwx------ 1 root root 64 May   8 14:25 1 -> /dev/pts/0
lrwx------ 1 root root 64 May   8 14:25 2 -> /dev/pts/0
lrwx------ 1 root root 64 May   8 14:29 255 -> /dev/pts/0

Тест 1:

[root@localhost ~]# echo "hello" > /proc/10155/fd/0

результат отображения контейнера:

[root@79d4ba3a2080 /]# hello

Тест 2:

[root@localhost ~]# echo "hello" > /dev/pts/0

результат отображения хоста:

[root@localhost ~]# tty
/dev/pts/0
[root@localhost ~]# hello

Результат показывает, что на хосте pts / 0 контейнер не отвечает.
В чем проблема с «Тестом 2»?

Почему не отображается в контейнере?

Что сделал docker?

Если есть какая-либо соответствующая информация, дайте мне знать, спасибо.

Понимаю:

Я смоделировал феномен типа с помощью следующей команды.

Смонтировать каталоги, которые зеркалируются docker CentOS 7

[root@localhost test]# mount -t overlay overlay -o lowerdir=/var/lib/docker/overlay2/e6e24960aabfb790c893d0d1e419cb34f97b92824941ab74b01348ef96c99412-init/diff:/var/lib/docker/overlay2/075bf06b50f9bc5fc2111b5e1c831f7f1304e3310a448e323e71ca9e7d83ba55/diff,upperdir=/var/lib/docker/overlay2/e6e24960aabfb790c893d0d1e419cb34f97b92824941ab74b01348ef96c99412/diff,workdir=/var/lib/docker/overlay2/e6e24960aabfb790c893d0d1e419cb34f97b92824941ab74b01348ef96c99412/work /project/test/t222

пространство имен Creat Pid:

[root@localhost t222]# unshare -u -i -p -m -n -f  --mount-proc /bin/bash
[root@localhost t222]# pivot_root . .
[root@localhost t222]# for e in "proc proc proc/" "sysfs sysfs sys/" "devtmpfs devtmpfs dev/" "devpts devpts dev/pts/" ; do mount -t ${e} ; done
[root@localhost t222]# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
overlay        overlay    17G   14G  3.8G  79% /
devtmpfs       devtmpfs  898M     0  898M   0% /dev

Тестовый файл :

В новом пространстве имен:

[root@localhost t222]# vi 123.txt

На хосте:

[root@localhost ~]# ps -ef
'''
root      28295  28030  0 5月10 pts/4   00:00:00 unshare -u -i -p -m -n -f --mount-proc /bin/bash
root      28297  28295  0 5月10 pts/4   00:00:00 /bin/bash
root      29921  28297  0 09:52 pts/4    00:00:00 vi 123.txt

Просмотр информации о процессе:

[root@localhost ~]# ll /proc/28295/cwd
lrwxrwxrwx 1 root root 0 5月  11 09:52 /proc/28295/cwd -> /
[root@localhost ~]# ll /proc/28297/cwd
lrwxrwxrwx 1 root root 0 5月  11 09:52 /proc/28297/cwd -> /
[root@localhost ~]# ll /proc/30272/cwd
lrwxrwxrwx 1 root root 0 5月  11 10:06 /proc/30272/cwd -> /
[root@localhost ~]# ll /proc/30272/fd
total 0
lrwx------ 1 root root 64 5月  11 10:06 0 -> /dev/pts/4
lrwx------ 1 root root 64 5月  11 10:06 1 -> /dev/pts/4
lrwx------ 1 root root 64 5月  11 10:06 2 -> /dev/pts/4
lrwx------ 1 root root 64 5月  11 10:06 3 -> /.123.txt.swp [red, soft connection does not exist]
[root@localhost ~]# touch /.123.txt.swp
[root@localhost ~]# ll /proc/30272/fd
total 0
lrwx------ 1 root root 64 5月  11 10:06 0 -> /dev/pts/4
lrwx------ 1 root root 64 5月  11 10:06 1 -> /dev/pts/4
lrwx------ 1 root root 64 5月  11 10:06 2 -> /dev/pts/4
lrwx------ 1 root root 64 5月  11 10:06 3 -> /.123.txt.swp [normal]

Сводка:

Информация о процессе, видимая на хосте, является информацией о процессе в новом пространстве имен, «ll / proc / 30272 / fd» показывает, что мягкое соединение не существует, оно основано на старом пространстве имен, в основном « pivot_ root ", изменен рабочий каталог всех текущих процессов

1 Ответ

0 голосов
/ 08 мая 2020

Вы не сопоставили устройства pts с контейнером, добавьте этот параметр в команду запуска: --volume /dev/pts:/dev/pts

Ссылка: https://docs.docker.com/storage/volumes/

$ docker run  -it --rm  --volume /dev/pts:/dev/pts centos bash
[root@b5010471931d /]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.5  0.0  12024  3168 pts/7    Ss   10:57   0:00 bash
root         16  0.0  0.0  43960  3324 pts/7    R+   10:57   0:00 ps aux

На хосте:

# echo hello_from_host > /dev/pts/7

В контейнере:

[root@b5010471931d /]# hello_from_host
...