Я пытаюсь запустить какое-то программное обеспечение в док-контейнере, которое хочет сделать 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 недоступен из контейнера, или есть какой-то способ дать больший контроль над контейнером?