14

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

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 

这个链接让我觉得问题出在手臂处理器上。

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

4

1 回答 1

25

问题确实在于 Docker 映像文件是特定于体系结构的(至少是默认的)。因此,在 Intel 上构建的 Docker 文件只能在 Intel 上运行,而为 Arm32 构建的 Docker 文件只能在 Arm32 上运行。

似乎有办法在英特尔设备上构建 Arm 版本,但这仍然会让您分发两个单独的图像。如果您有物理 Arm 设备,直接在 Arm 设备上构建 Arm 映像会容易得多。

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

于 2018-10-13T14:01:38.207 回答