Docker 集线器映像失败,但构建其 Dockerfile 有效怎么了?

问题描述

我最近使用了很多Docker-compose,但是这次我找到了一个我很想使用的容器,但是docker hub的镜像与我的arm/v6 raspberry pi不兼容。 无论如何使用它会导致

standard_init_linux.go:219: exec user process caused: exec format error

奇怪的是,复制Dockerfile并使用

    build:
      context: ./ttrss-docker/src/app

导致应用运行良好。但是因为某些原因,我无法使用 dockerhub 的镜像。

如果重要,Dockerfile 为 this,Docker Hub 映像为 this

FROM alpine:3.12
EXPOSE 9000/tcp

RUN apk add --no-cache dcron php7 php7-fpm \
    php7-pdo php7-gd php7-pgsql php7-pdo_pgsql php7-mbstring \
    php7-intl php7-xml php7-curl php7-session \
    php7-dom php7-fileinfo php7-json \
    php7-pcntl php7-posix php7-zip php7-openssl \
    git postgresql-client sudo

ADD startup.sh /
ADD updater.sh /
ADD index.php /
ADD dcron.sh /
ADD backup.sh /etc/periodic/weekly/backup

RUN sed -i.bak 's/^listen = 127.0.0.1:9000/listen = 9000/' /etc/php7/php-fpm.d/www.conf
RUN sed -i.bak 's/\(memory_limit =\) 128M/\1 256M/' /etc/php7/php.ini

RUN mkdir -p /var/www

CMD /startup.sh

问题:如果我不使用 Docker hubs 镜像,Watchtower 可以更新我的容器吗? 如果没有,有谁知道发生了什么以及我如何实现通过 Watchtower 更新的容器?

非常感谢:)

解决方法

您正在提取的映像仅针对单一架构构建:amd64。生成的二进制文件和库无法在其他平台上使用,例如 Raspberry Pi 使用的 ARM。以下是验证这一点的调试步骤。

清单是 application/vnd.docker.distribution.manifest.v2+json

$ regctl image manifest --list cthulhoo/ttrss-fpm-pgsql-static
{                                                                                        
  "schemaVersion": 2,"mediaType": "application/vnd.docker.distribution.manifest.v2+json","config": {
    "mediaType": "application/vnd.docker.container.image.v1+json","size": 4257,"digest": "sha256:916ae5126809992b922c5db0f41e62a40be245703685e19f51797db95f312e81"
  },...

检查该图像的架构:

$ regctl image inspect cthulhoo/ttrss-fpm-pgsql-static --format '{{.Architecture}}'                                    
amd64 

这需要由映像创建者修复才能为 ARM 平台构建映像,您可以在 Alpine 基础映像中看到这一点。

$ regctl image manifest --list alpine:3.12        
{                                                          
  "schemaVersion": 2,"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json","manifests": [
    {                                             
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json","size": 528,"digest": "sha256:074d3636ebda6dd446d0d00304c4454f468237fdacf08fb0eeac90bdbfa1bac7","platform": {
        "architecture": "amd64","os": "linux"                                                                                                                                                                                                                                                           
      }           
    },{
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json","digest": "sha256:096ebf69d65b5dcb3756fcfb053e6031a3935542f20cd7a8b7c59e1b3cb71558","platform": {
        "architecture": "arm","os": "linux","variant": "v6"
      }
    },"digest": "sha256:299294be8699c1b323c137f972fd0aa5eaa4b95489c213091dcf46ef39b6c810","variant": "v7"
      }
    },...

构建多平台映像通常使用 buildx 完成。上面使用的 regctl 命令是我的 regclient 项目的一部分。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...