我尝试在Travis-CI上为多个架构构建Docker镜像,对于amd64和i386来说效果不错,但是对于ARM则失败了。
Dockerfile基于{ARCH}/nextcloud:apache
创建,而这个又是基于php:7.3-apache-stretch
创建的,后者又使用了debian:stretch-slim
。因此所有的镜像都使用相同的堆栈,应该有类似的反应。
.travis.yml
env:
- TAG=i386 ARCH=i386
- TAG=amd64 ARCH=amd64
- TAG=armhf ARCH=arm32v7
- TAG=aarch64 ARCH=arm64v8
before_script:
- docker run --rm --privileged multiarch/qemu-user-static:register --reset
script:
- docker build --pull --build-arg ARCH=$ARCH -t escoand/nextcloud:$TAG nextcloud
Dockerfile
ARG ARCH
FROM ${ARCH}/nextcloud:apache
RUN apt-get update && apt-get install -y supervisor && \
rm -rf /var/lib/apt/lists/* && \
mkdir /var/log/supervisord /var/run/supervisord
如上所述,i386和amd64版本的构建没有问题。但是ARM版本的构建已经在第一个RUN命令时失败:
standard_init_linux.go:185: exec user process caused "no such file or directory"
The command '/bin/sh -c apt-get update && apt-get install -y supervisor && rm -rf /var/lib/apt/lists/* && mkdir /var/log/supervisord /var/run/supervisord' returned a non-zero code: 1
https://travis-ci.org/escoand/dockerfiles/jobs/562967055
对我来说,这似乎是/bin/sh
的问题,但我不知道该如何处理。
容器二进制文件 --> 主机binfmt --> 容器qemu
好的,当我想到它时,我看到Dockerfiles将qemu-*-static二进制文件复制到实际镜像中。我看到了它,但没有理解。现在清楚了。再次感谢您的解释。 - user3775041execve()
的进程所在的 mount namespace 中查找二进制文件,即从构建容器文件系统中查找。 - Danila Kiver