首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在buildah中运行mknod时出错

在buildah中运行mknod时出错
EN

Server Fault用户
提问于 2020-03-25 14:45:41
回答 1查看 587关注 0票数 1

我正在努力将我现有的CentOS 7 Docker映像构建过程转换为使用Buildah,并且遇到了mknod的问题。

目前,我使用下面的Dockerfile来构建一个新的映像。因此,基本上使用映像构建图像,以避免对构建主机的依赖。我是这样运作的:

代码语言:javascript
复制
docker build -f Dockerfile.builder -t centosbuilder:latest . && \
docker run --rm centosbuilder:latest | docker import - mycentos:latest

这是Dockerfile:

代码语言:javascript
复制
FROM centos:7

ENV ROOTFS /image_build_root
ENV TMPDIR /tmp/image_build

WORKDIR ${TMPDIR}
RUN mkdir -p ${ROOTFS}
RUN mkdir -m 755 ${ROOTFS}/dev && \
    mknod -m 600 ${ROOTFS}/dev/console c 5 1 && \
    mknod -m 600 ${ROOTFS}/dev/initctl p && \
    mknod -m 666 ${ROOTFS}/dev/full c 1 7 && \
    mknod -m 666 ${ROOTFS}/dev/null c 1 3 && \
    mknod -m 666 ${ROOTFS}/dev/ptmx c 5 2 && \
    mknod -m 666 ${ROOTFS}/dev/random c 1 8 && \
    mknod -m 666 ${ROOTFS}/dev/tty c 5 0 && \
    mknod -m 666 ${ROOTFS}/dev/tty0 c 4 0 && \
    mknod -m 666 ${ROOTFS}/dev/urandom c 1 9 && \
    mknod -m 666 ${ROOTFS}/dev/zero c 1 5
RUN yum --installroot=${ROOTFS} --releasever=7 --setopt=tsflags=nodocs --setopt=group_package_types=mandatory -y groupinstall Core
RUN yum --installroot=${ROOTFS} -y clean all
RUN echo "NETWORKING=yes" > ${ROOTFS}/etc/sysconfig/network && \
    echo "HOSTNAME=localhost.localdomain" > ${ROOTFS}/etc/sysconfig/network
RUN rm -rf ${ROOTFS}/usr/{{lib,share}/locale,{lib,lib64}/gconv,bin/localedef,sbin/build-locale-archive} && \
    #  docs and man pages
    rm -rf ${ROOTFS}/usr/share/{man,doc,info,gnome/help} && \
    #  cracklib
    rm -rf ${ROOTFS}/usr/share/cracklib && \
    #  i18n
    rm -rf ${ROOTFS}/usr/share/i18n && \
    #  yum cache
    rm -rf ${ROOTFS}/var/cache/yum && \
    mkdir -p --mode=0755 ${ROOTFS}/var/cache/yum && \
    #  sln
    rm -rf ${ROOTFS}/sbin/sln && \
    #  ldconfig
    rm -rf ${ROOTFS}/etc/ld.so.cache ${ROOTFS}/var/cache/ldconfig && \
    mkdir -p --mode=0755 ${ROOTFS}/var/cache/ldconfig
CMD /usr/bin/tar -cf - -C ${ROOTFS} .

使用Buildah,我在这一行中遇到了第一个错误:

代码语言:javascript
复制
$ buildah run "${BUILDER}" mknod -m 600 "${ROOTFS}/dev/console" c 5 1
/usr/bin/mknod: '/image_build_root/dev/console': Operation not permitted
ERRO exit status 1

我尝试将我的构建脚本(见下文)作为根运行,但没有效果。我假设可能没有设置CAP_MKNOD功能,但是即使手动启用它,我也会得到相同的错误。

构建脚本:

代码语言:javascript
复制
#!/bin/bash -x

set -e

ROOTFS=/image_build_root
TMPDIR=/tmp/image_build

BUILDER="$(buildah from docker.io/library/centos:7)"
buildah config --workingdir "${TMPDIR}" "${BUILDER}"
buildah run "${BUILDER}" mkdir -p "${ROOTFS}"
buildah run "${BUILDER}" mkdir -m 755 "${ROOTFS}/dev"
buildah run --cap-add=CAP_MKNOD "${BUILDER}" mknod -m 600 "${ROOTFS}/dev/console" c 5 1
buildah run "${BUILDER}" mknod -m 600 "${ROOTFS}/dev/initctl" p
buildah run "${BUILDER}" mknod -m 666 "${ROOTFS}/dev/full" c 1 7
buildah run "${BUILDER}" mknod -m 666 "${ROOTFS}/dev/null" c 1 3
buildah run "${BUILDER}" mknod -m 666 "${ROOTFS}/dev/ptmx" c 5 2
buildah run "${BUILDER}" mknod -m 666 "${ROOTFS}/dev/random" c 1 8
buildah run "${BUILDER}" mknod -m 666 "${ROOTFS}/dev/tty" c 5 0
buildah run "${BUILDER}" mknod -m 666 "${ROOTFS}/dev/tty0" c 4 0
buildah run "${BUILDER}" mknod -m 666 "${ROOTFS}/dev/urandom" c 1 9
buildah run "${BUILDER}" mknod -m 666 "${ROOTFS}/dev/zero" c 1 5
buildah run "${BUILDER}" yum \
    --installroot="${ROOTFS}" \
    --releasever=7 \
    --setopt=tsflags=nodocs \
    --setopt=group_package_types=mandatory \
    -y \
    groupinstall Core
buildah run "${BUILDER}" yum --installroot="${ROOTFS}" -y clean all
buildah run "${BUILDER}" echo "NETWORKING=yes" > "${ROOTFS}/etc/sysconfig/network"
buildah run "${BUILDER}" echo "HOSTNAME=localhost.localdomain" > "${ROOTFS}/etc/sysconfig/network"
buildah run "${BUILDER}" rm -rf \
    "${ROOTFS}/usr/{{lib,share}/locale,{lib,lib64}/gconv,bin/localedef,sbin/build-locale-archive}" \
    "${ROOTFS}/usr/share/{man,doc,info,gnome/help}" \
    "${ROOTFS}/usr/share/cracklib" \
    "${ROOTFS}/usr/share/i18n" \
    "${ROOTFS}/var/cache/yum" \
    "${ROOTFS}/sbin/sln" \
    "${ROOTFS}/etc/ld.so.cache" \
    "${ROOTFS}/var/cache/ldconfig"
buildah run "${BUILDER}" mkdir -p --mode=0755 "${ROOTFS}/var/cache/yum"
buildah run "${BUILDER}" mkdir -p --mode=0755 "${ROOTFS}/var/cache/ldconfig"
buildah config --cmd /usr/bin/tar -cf - -C "${ROOTFS}" . "${BUILDER}"
buildah commit "${BUILDER}" centos7builder
EN

回答 1

Server Fault用户

回答已采纳

发布于 2021-05-14 23:05:39

一个没有特权的用户(无根)没有足够的特权来使用mknod,内核阻止了它。不管用户名称空间中还剩下多少功能,它仍然不能使用它。

请参考以下问题

不可能使用mknodbuildah bud/run --isolation="rootless"。您需要忽略mknod或使用另一个isolation。不可能把它们混合在一起。这太可怕了,什么也做不了。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1008343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档