standard_init_linux.go:211:exec用户进程与高山linux和python导致“没有这样的文件或目录”

时间:2019-11-21 10:21:16

标签: python docker alpine dockerpy

我有一个目录,其中包含docker文件,attack.py和requirements.txt。

使用它,我创建了以下dockerfile:

FROM arm64v8/python:3.7-alpine

COPY qemu-arm-static /usr/bin

COPY ./ app-ids
WORKDIR /app-ids

RUN pip install --no-cache-dir -r requirements.txt

CMD["python","./attack.py"]

但是,pip安装行会抛出: standard_init_linux.go:211:exec用户进程导致“没有这样的文件或目录”

我不知道为什么。尝试使用ls,pwd等命令进行调试会产生相同的错误。

有人可以解释我到底在做什么错吗?

1 个答案:

答案 0 :(得分:6)

我猜您正在尝试在非arm64v8平台上构建docker映像。我会以为其余的答案。

提供的解决方案将特定于Ubuntu发行版(主机),但是我想它应该与其他Linux发行版类似。

解决方案1 ​​ [在Ubuntu 18.04上运行]

https://github.com/docker/for-linux/issues/56中我们可以看到Debian(以及Ubuntu?)软件包中当前存在错误。

sudo apt-get install qemu-user-static

git clone https://github.com/computermouth/qemu-static-conf.git
sudo mkdir -p /lib/binfmt.d
sudo cp qemu-static-conf/*.conf /lib/binfmt.d/
sudo systemctl restart systemd-binfmt.service

这将从解决方案2中删除qemu-user-binfmt方法。但是,在该软件包中,提供的配置文件不在systemd-binfmt所使用的文件夹中,并且配置错误。

此外,我们从git存储库中获取配置文件,并将其放置在systemd-binfmt查找的文件夹中:/lib/binfmt.d/(而不是/var/lib/binfmts/由qemu-user-static安装)< / p>

然后检查状态:

systemctl status systemd-binfmt

然后尝试再次编译您的docker。应该可以!

解决方案2 [当前不适用于Ubuntu 18.04]

它以前是以前的手动配置过程,但现在通过apt软件包支持:

sudo apt-get install qemu-user-binfmt

这样,它将为binfmt下的所有平台创建/proc/sys/fs/binfmt_misc/qemu-*配置。当您的系统检测到可执行文件是供arm使用时,它将调用qemu而不是尝试直接执行。

以下是指向更详细说明的链接:https://ownyourbits.com/2018/06/13/transparently-running-binaries-from-any-architecture-in-linux-with-qemu-and-binfmt_misc/https://ownyourbits.com/2018/06/27/running-and-building-arm-docker-containers-in-x86/

要了解其工作原理,请参考以下段落:

内核识别ARM ELF魔术,并使用解释器 /usr/bin/qemu-arm-static,这是针对 建筑。十六进制的0x7F'ELF'为7f 45 4c 46,因此我们可以 看看魔术和面具如何一起工作,考虑 ELF标头的结构

typedef struct {
    unsigned char e_ident[EI_NIDENT];   /* 0x7F 'ELF' four byte ELF magic for any architecture */
    uint16_t e_type;
    uint16_t e_machine;                 /* architecture code, 40=0x28 in the case of ARM */
    uint32_t e_version;
    ElfN_Addr e_entry;
    ElfN_Off e_phoff;
    ElfN_Off e_shoff;
    uint32_t e_flags;
    uint16_t e_ehsize;
    uint16_t e_phentsize;
    uint16_t e_phnum;
    uint16_t e_shentsize;
    uint16_t e_shnum;
    uint16_t e_shstrndx;
} ElfN_Ehdr;

请注意,binfmt配置由docker共享,因此它将尝试将/usr/bin/qemu-arm-static放入容器中。这就是您仍然需要复制/ usr / bin / qemu-arm-static的原因。