Docker 错误 standard_init_linux.go:185: exec 用户进程导致“Qnap TS131P 的 exec 格式错误

Docker Error standard_init_linux.go:185: exec user process caused "exec format error with Qnap TS131P

我的 Docker 文件是 song/songkong 在 https://hub.docker.com/r/songkong/songkong/~/dockerfile/

FROM openjdk:8-jre-alpine

RUN apk --no-cache add \
      ca-certificates \
      curl \
      fontconfig \
      msttcorefonts-installer \
      tini \
 && update-ms-fonts \
 && fc-cache -f

RUN mkdir -p /opt \
 && curl http://www.jthink.net/songkong/downloads/current/songkong-linux-headless-novm.tgz?val=77 | tar -C /opt -xzf - \
&& find /opt/songkong -perm /u+x -type f -print0 | xargs -0 chmod a+x

RUN addgroup -S songkong \
 && adduser -S -G songkong songkong

USER songkong:songkong

EXPOSE 4567

ENTRYPOINT ["/sbin/tini"]

# Config, License, Logs, Reports and Internal Database
VOLUME /songkong

# Music folder should be mounted here
VOLUME /music

WORKDIR /opt/songkong

CMD /opt/songkong/songkongremote8.sh

在 Synology DS218+ Disk Station (Intel) 上运行良好

我购买了 Qnap TS-131P 来测试 Qnap,同时确认它可以与 Arm 处理器一起使用,因为 Qnap 在 arm 处理器上支持 Docker 而 Synology 不支持。

当我尝试从图像启动 Container 时出现错误

standard_init_linux.go:185: exec user process caused "exec format error 

this link让我觉得问题出在arm处理器上。

但我很困惑,因为我认为 Docker 的全部意义在于隐藏这些系统特定的细节,我如何(可以)修复我的 Docker 文件以便它在 Qnap 上工作。

问题确实是 Docker 图像文件是特定于架构的(至少是默认的)。因此,基于 Intel 构建的 Docker 文件仅适用于 Intel,而针对 Arm32 构建的 Docker 文件仅适用于 Arm32。

似乎有一些方法可以在 Intel 设备上构建 Arm 版本,但这仍然会让您分发两个单独的映像。如果您有物理 Arm 设备,直接在 Arm 设备上构建 Arm 映像会容易得多。

您还需要确保您的基础镜像支持您的架构,但官方镜像现在已经构建为多架构镜像,所以这通常不是问题。