执行临时文件夹中的二进制文件时权限被拒绝(Docker)

myss37ts  于 2022-11-03  发布在  Docker
关注(0)|答案(2)|浏览(253)

你好,我正在尝试建立一个映像,可以编译和运行一个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目录是受限制的。
因为,我使用只读根文件系统,我只能在临时目录上工作,请指导我如何才能实现上述任务保持我的容器安全。

b4qexyjb

b4qexyjb1#

Docker的tmpfs默认选项包括noexecdocker run --tmpfs允许一组扩展的挂载选项,但是Compose tmpfs:volumes:的扩展语法都不允许更改除size选项以外的任何内容。
这里一个简单的选择是使用匿名卷。从语法上看,这看起来像一个普通的volumes:行,只是它只有一个容器路径。read_only:选项将使容器的根文件系统为只读,但卷不受此限制。

version: '3.8'
services:
  ...
    read_only: true
    volumes:
      - /build # which will be read-write

这将是一个“正常”的Docker卷,因此它将是磁盘备份的,您将能够在docker volume ls中看到它。

ybzsozfc

ybzsozfc2#

完整的解决方案摘要-
@davidmaze提到要添加一个使用

version: '3.8'
services:
  ...
    read_only: true
    volumes:
      - /build # which will be read-write

当我试图编译我的程序时,我仍然得到一个错误Cannot create temporary file in ./: Read-only file system。当我调试我的容器以查看read_only:false模式下的文件系统变化时,我发现编译器试图将a.out文件保存在/bin文件夹中,该文件夹应该是只读的。
所以我在入口点之前添加了这一附加行,我的问题就解决了。

FROM golang:latest as builder

WORKDIR /app
COPY . .

RUN go mod download
RUN env CGO_ENABLED=0 go build -o /worker

FROM alpine:latest
RUN apk update && apk add --no-cache g++ && apk add --no-cache tzdata
ENV TZ=Asia/Kolkata

WORKDIR /

COPY --from=builder worker /bin

ARG USER=default
RUN addgroup -S $USER && adduser -S $USER -G $USER

USER $USER

WORKDIR /build <---- this line

ENTRYPOINT [ "worker" ]

相关问题