Make 无法在 Alpine Linux 容器中以 root 身份运行 mkdir

2023-12-21

因此,我尝试在 Alpine Linux Docker 容器内构建 musl-libc。配置脚本成功,但 make 立即停止,因为它无法运行 mkdir:

mkdir -p lib
make: mkdir: Operation not permitted
make: *** [Makefile:96: lib] Error 127

使用 strace,我可以看到它在检查各种 mkdir 符号链接的访问时获得 EPERM,因此它实际上从未运行命令本身:

faccessat2(AT_FDCWD, "/usr/local/sbin/mkdir", X_OK, AT_EACCESS) = -1 EPERM (Operation not permitted)
faccessat2(AT_FDCWD, "/usr/local/bin/mkdir", X_OK, AT_EACCESS) = -1 EPERM (Operation not permitted)
faccessat2(AT_FDCWD, "/usr/sbin/mkdir", X_OK, AT_EACCESS) = -1 EPERM (Operation not permitted)
faccessat2(AT_FDCWD, "/usr/bin/mkdir", X_OK, AT_EACCESS) = -1 EPERM (Operation not permitted)
faccessat2(AT_FDCWD, "/sbin/mkdir", X_OK, AT_EACCESS) = -1 EPERM (Operation not permitted)
faccessat2(AT_FDCWD, "/bin/mkdir", X_OK, AT_EACCESS) = -1 EPERM (Operation not permitted)

我不知道这是为什么。我以 root 身份运行 make,并且/bin/busybox无论如何,为所有用户设置了可执行位。我可以从命令行很好地创建目录。这是怎么回事?我该如何解决?

编辑: 根据要求,这是我正在使用的 Dockerfile:

FROM alpine

ENV UTILS='vim tmux gdb strace git mandoc'
ENV DEPS='gcc make'

RUN apk update && apk add $DEPS $UTILS
ADD musl-src /musl-libc
ENV NPROC=6
RUN cd musl-libc && ./configure --prefix=/usr --enable-debug && \
    make -j$NPROC
RUN cd musl-libc && make install

需要 musl 源./musl-src.


解决方法:使用 bmake 而不是 make

我在 Alpine 的容器化构建中遇到了完全相同的问题,其中make是 GNU make 4.3。该构建在本地 Docker 上运行良好,但在 ADO 管道代理上失败。或者,与 make 尝试的命令序列相同,直接从RUN,也工作得很好。

管道代理基于 RHEL7 以及 RH 选择打包的 Docker 版本。我无法在它们上升级 Docker,也无法使用特殊选项和不同的安全配置文件启动它。它由不同的团队管理,不受我的控制。

参考上面的评论和另一个问题statx 需要哪些功能才能停止提供 EPERM https://stackoverflow.com/questions/48995826猜测的替代实现似乎是合理的make可能会使用旧的stat而不是statx这个旧版本的 Docker 遇到了问题。

事实上,NetBSD 的bmake暂时给我一个解决方案。

RUN apk add --upgrade gcc libc-dev bmake

RUN bmake dist
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Make 无法在 Alpine Linux 容器中以 root 身份运行 mkdir 的相关文章

随机推荐