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

14

我的 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+磁盘站(Intel)很好地配合使用。

我购买了一个Qnap TS-131P来测试Qnap,但也是为了确认它可以在Arm处理器上工作,因为Qnap支持Arm处理器上的Docker,而Synology则不支持。

当我尝试从镜像启动容器时,出现错误。

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

此链接让我想到问题是由于ARM处理器造成的。

但我很困惑,因为我认为Docker的整个目的就是隐藏这些特定于系统的细节,如何(可以)修复我的Docker文件,使其在QNAP上运行。


1
Docker 不能神奇地使 x86 二进制文件能够在 ARM 上运行。你需要重建一个 ARM 镜像。 - David Maze
@DavidMaze 好的,但我该怎么做呢?它只是使用DockerHub构建,我没有看到ARM选项,这是否意味着应该有两个单独的镜像,用户需要自己决定使用哪一个。 - Paul Taylor
1个回答

25
问题的确是Docker镜像文件具有特定的架构(至少默认的镜像文件如此)。所以在Intel上构建的Docker文件只能在Intel上运行,而在Arm32上构建的Docker文件则仅适用于Arm32。
看起来有一些方法可以在Intel设备上构建Arm版本,但这仍然需要你分发两个独立的镜像。如果你有一个物理的Arm设备,直接在该设备上构建一个Arm镜像会更容易。
您还需要确保基础镜像支持您的架构,但官方的已经构建为多架构镜像,因此通常不会出现这种问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接