我正在尝试在Docker容器中运行某些软件,该容器想要为当前使用的tty做VT_SETMODE。这将始终失败,并显示一条错误消息“不允许操作”。
我尝试在没有运气的情况下玩权限/组。
最后,我创建了一个小片段来重现该错误:
#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;
}
我在带有简单dockerfile的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,或者有某种方法可以对容器进行更多控制?
答案 0 :(得分:0)
好的,看来我已经解决了自己的问题。我试图在没有特权进行tty配置的容器内运行代码。将--cap-add SYS_TTY_CONFIG
添加到docker run命令可以解决此问题。