簡體   English   中英

Docker 集線器映像失敗,但構建其 Dockerfile 有效。 怎么了?

[英]Docker hub image fails but building its Dockerfile works. What is happening?

我最近經常使用 Docker-compose,但是這次我找到了一個我很想使用的容器,但是 docker 集線器的圖像與我的 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 就是這個,Docker Hub 圖像就是這個

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 集線器映像,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",
      "size": 528,
      "digest": "sha256:096ebf69d65b5dcb3756fcfb053e6031a3935542f20cd7a8b7c59e1b3cb71558",
      "platform": {
        "architecture": "arm",
        "os": "linux",
        "variant": "v6"
      }
    },
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 528,
      "digest": "sha256:299294be8699c1b323c137f972fd0aa5eaa4b95489c213091dcf46ef39b6c810",
      "platform": {
        "architecture": "arm",
        "os": "linux",
        "variant": "v7"
      }
    },
    ...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM