Нет прав на изменение режима tty внутри док-контейнера - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь запустить какое-то программное обеспечение в док-контейнере, которое хочет сделать VT_SETMODE для tty, используемого в данный момент.Это всегда приводит к ошибке с сообщением «Операция не разрешена».

Я попытался поиграть с разрешениями / группами без удачи.

Наконец, я создал небольшой фрагмент, чтобы воспроизвести ошибку:

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <linux/vt.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>

int main() {
        const char *tty_path;
        tty_path = "/dev/tty1";

        int fd = open(tty_path, O_RDWR | O_CLOEXEC);

        if (fd < 0) {
                printf("ERROR: Failed to open %s\n", strerror(errno));
                return 1;
        }

        struct vt_mode mode = {
                .mode = VT_AUTO,
        };
        errno = 0;

        ioctl(fd, VT_SETMODE, &mode);

        if (errno) {
                printf("ERROR: %s\n", strerror(errno));
                return 1;
        }

        return 0;
}

Я запустил код в контейнере Docker с помощью простого файла Docker:

FROM archlinux/base

RUN pacman -Sy --noconfirm gcc

Это было начато с командой:

docker build -f Dockerfile -t tty-test . && docker run --device /dev/tty1 -v $HOME/tty-test:/volume -it tty-test /bin/bash -c 'cd /volume && gcc tty_r.c && ./a.out ; /bin/bash'

Вывод это:

ERROR: Operation not permitted

Может кто-нибудь объяснить, почему tty недоступен из контейнера, или есть какой-то способ дать больший контроль над контейнером?

1 Ответ

0 голосов
/ 30 мая 2019

Хорошо, похоже, я решил свою проблему. Я пытался запустить код внутри контейнера, у которого не было привилегий для настройки tty. Добавление --cap-add SYS_TTY_CONFIG к команде запуска docker устранило проблему.

...