Docker роится с файлом компоновки, устанавливает архитектуру на arm64

У меня проблема с кластером машин arm64, которые не запускают контейнеры. Все они остаются как 0/2, 0/1 и т. д. Похоже, это связано с настройкой расписания для их развертывания на amd64 вместо arm64, но я не могу найти, где это изменить (я предполагаю, что для этого есть конфигурация docker-compose).

$ sudo docker service ls                                                                                                                             1 ↵
ID                  NAME                         MODE                REPLICAS            IMAGE                                                  PORTS
t761cgtu2n4o        persistence_mariadb          replicated          0/1                 mojlighetsministeriet/mariadb-arm64:latest             *:3306->3306/tcp
l1gxlfuwtfs9        services_email               replicated          0/2                 mojlighetsministeriet/email-arm64:latest               
6o1ud2la0eig        services_groups              replicated          0/2                 mojlighetsministeriet/groups-arm64:latest     

При проверке сервиса я получаю:

        "Placement": {                        
            "Platforms": [                    
                {                                                                                                                                                                        
                    "Architecture": "amd64",
                    "OS": "linux"
                }
            ]
        },

Я использую файлы docker-compose для настройки служб, как я могу пометить образы для запуска на машинах arm64 (образы нормально запускаются на машинах arm64 с $ docker run)?

Это пример конфига для одного сервиса:

  email:
    image: mojlighetsministeriet/email-arm64
    secrets:
      - smtp-password
    environment:
      SMTP_HOST: smtp.example.com
      SMTP_PORT: 587
      SMTP_EMAIL: [email protected]
    deploy:
      replicas: 2
      update_config:
        parallelism: 1
        delay: 10s
        failure_action: continue
        monitor: 60s
        max_failure_ratio: 0.3
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
      labels:
        - traefik.docker.network=proxy
        - traefik.port=80
        - traefik.enable=true
    networks:
      - proxy

person tirithen    schedule 13.12.2017    source источник
comment
Вы когда-нибудь находили решение этой проблемы? у меня такая же проблема   -  person Pablo Romeo    schedule 21.08.2018
comment
@PabloRomeo Я решил это, но не уверен, как именно сейчас (прошло некоторое время с тех пор, как я работал над кластером), возможно, я использовал одну из этих машин для создания образов.   -  person tirithen    schedule 22.08.2018
comment
Благодарность! Я нашел способ обойти это и разместил его здесь как ответ для потомков :)   -  person Pablo Romeo    schedule 23.08.2018


Ответы (2)


Чтобы образы Docker могли работать на компьютерах на базе ARM, необходимо, чтобы базовый образ (контейнер) был основан на ARM.

Вы не можете указать docker-compose просто работать в режиме ARM. Фактическое изображение должно быть основано на ARM.

например здесь, на hub.docker.com, вы можете найти базовые образы, созданные для компьютеров на базе ARM

person Ivonet    schedule 13.12.2017

Мне удалось обойти ту же проблему, используя параметр --resolve-image never при развертывании стека.

docker stack deploy <stack name> --compose-file <compose-file>.yml --resolve-image never

То же самое можно сделать во время docker service create с помощью --no-resolve-image

person Pablo Romeo    schedule 22.08.2018