你好,我正在尝试建立一个映像,可以编译和运行一个c++程序安全。
第一个
这里的worker是一个golang二进制文件,它从环境变量中读取code并将其存储在**/tmp文件夹中作为main.cpp**,然后尝试使用g++ /tmp/main.cpp
&& ./tmp/a.out
(使用golang exec)编译并运行它
我得到这个错误scratch_4-gpp-1 | Error : fork/exec /tmp/a.out: permission denied
,从中我可以理解/知道,执行任何从tmp目录是受限制的。
因为,我使用只读根文件系统,我只能在临时目录上工作,请指导我如何才能实现上述任务保持我的容器安全。
2条答案
按热度按时间b4qexyjb1#
Docker的tmpfs默认选项包括
noexec
。docker run --tmpfs
允许一组扩展的挂载选项,但是Composetmpfs:
和volumes:
的扩展语法都不允许更改除size选项以外的任何内容。这里一个简单的选择是使用匿名卷。从语法上看,这看起来像一个普通的
volumes:
行,只是它只有一个容器路径。read_only:
选项将使容器的根文件系统为只读,但卷不受此限制。这将是一个“正常”的Docker卷,因此它将是磁盘备份的,您将能够在
docker volume ls
中看到它。ybzsozfc2#
完整的解决方案摘要-
@davidmaze提到要添加一个使用
当我试图编译我的程序时,我仍然得到一个错误
Cannot create temporary file in ./: Read-only file system
。当我调试我的容器以查看read_only:false
模式下的文件系统变化时,我发现编译器试图将a.out
文件保存在/bin
文件夹中,该文件夹应该是只读的。所以我在入口点之前添加了这一附加行,我的问题就解决了。