«ошибка формата exec» при запуске сборки контейнеров с чипом Apple M1 (системы на базе ARM)

# #docker #google-cloud-run

Вопрос:

Ожидаемое поведение: Я могу запустить контейнер, который я создал, используя чип Apple M1.

Наблюдаемое поведение:

Предполагая, что у вас есть учетная запись Google Cloud Run и вы можете отправлять изображения Docker в реестр контейнеров Google. Я использую https://github.com/seenickcode/trivial-go-api для этого примера.

  1. `клон мерзавца git@github.com:seenickcode/trivial-go-api.git’
  2. cd trivial-go-api
  3. docker build -t gcr.io/<YOUR GCR PROJECT ID>/example .
  4. docker push -t gcr.io/<YOUR GCR PROJECT ID>/example
  5. Перейдите в console.cloud.google.com Google Cloud Run > Создать новую службу >> выберите изображение pushed Docker со всеми параметрами по умолчанию >>> Выполнить
  6. Показана ошибка:
 Cloud Run error: Container failed to start. 
Failed to start and then listen on the port defined by the PORT environment variable. 
Logs for this revision might contain more information.
 

Бревна:

 2021-04-02 09:35:40.045 EDT
Cloud Run ReplaceService example hello@redactedforso.com {@type: type.googleapis.com/google.cloud.audit.AuditLog, authenticationInfo: {…}, authorizationInfo: […], methodName: google.cloud.run.v1.Services.ReplaceService, request: {…}, requestMetadata: {…}, resourceLocation: {…}, resourceName: namespaces/myprojectforso-282419/services/example, response: {…}, servi…
Error
2021-04-02 09:35:49.034 EDT
terminated: Application failed to start: Failed to create init process: failed to load /app/main: exec format error
Warning
2021-04-02 09:35:49.174 EDT
Application exec likely failed
Notice
2021-04-02 09:57:43.102 EDT
Cloud Run ReplaceService example hello@redactedforso.com {@type: type.googleapis.com/google.cloud.audit.AuditLog, authenticationInfo: {…}, authorizationInfo: […], methodName: google.cloud.run.v1.Services.ReplaceService, request: {…}, requestMetadata: {…}, resourceLocation: {…}, resourceName: namespaces/myprojectforso-282419/services/example, response: {…}, servi…
Error
2021-04-02 09:57:50.657 EDT
terminated: Application failed to start: Failed to create init process: failed to load /app/main: exec format error
 

Системные сведения о том, где я создаю свой образ:

  • ОС: macOS 11.2.3
  • Чип: Apple M1
  • Версия Docker: Рабочий стол Docker для macOS v3.3.0 (62345)

Важные примечания:

  • Все это прекрасно работает для меня, когда я использую другую архитектуру, например, с помощью Google Container Build или моего домашнего рабочего стола Windows (WSL).
  • Это также не работает с другими кодовыми базами, построенными с использованием чипа Apple M1, например, с другим проектом, который я написал в Rust, а также в Dart. Не похоже, что это связано с языком.
  • Я использую Google Cloud Run в течение многих лет, эта проблема возникла при использовании моего нового ноутбука с чипом Apple M1.

Комментарии:

1. Вы создаете код на платформе ARM и пытаетесь запустить его на платформе x86_64. Глядя на этот документ , не кажется, что Google Cloud предоставляет платформу ARM. Вам нужно будет создавать свои изображения на платформе, совместимой с вашей целевой средой.

Ответ №1:

Вы создаете образ, совместимый с ARM, который Google Cloud не поддерживает.

Я столкнулся с аналогичной проблемой, отправив свой образ, созданный на Mac M1, в Heroku, который я решил, используя buildx и установив ожидаемую платформу

 docker buildx build --platform linux/amd64 -t myapp .
 

Я написал средний пост, чтобы объяснить проблему и предложить 2 решения.

Docker по своей конструкции является мультиплатформенным и может работать на разных архитектурах, однако изображения должны соответствовать платформе, на которой они будут выполняться. Но это не наш случай.

Комментарии:

1. Имеет смысл. В то время buildx как подход работает для приведенного выше примера тривиального Go, когда я использую его для веб-приложения Rust среднего размера, случайные библиотеки не компилируются. Я получаю код выхода 101, и сбой происходит во время компиляции случайных библиотек Rust. Есть какие-нибудь идеи?

2. Трудно сказать, не видя ошибок, я бы попробовал другой вариант (установить DOCKER_DEFAULT_PLATFORM)

3. Метод DOCKER_DEFAULT_PLATFORM, к сожалению, выдает ту же ошибку. Либо моя система недостаточно мощная, либо использование buildx может быть хрупким для компиляции определенных библиотек Rust. На данный момент я зарезервировал дешевый оптимизированный для вычислений спотовый экземпляр AWS в качестве сервера сборки.

4. Хороший вариант, я использую действие GitHub для создания своих изображений docker и отправки их в Heroku. Если вам интересно, в одном из моих репозиториев GitHub есть пример.

5. Это по-прежнему отлично работает.