# #docker #google-cloud-run
Вопрос:
Ожидаемое поведение: Я могу запустить контейнер, который я создал, используя чип Apple M1.
Наблюдаемое поведение:
Предполагая, что у вас есть учетная запись Google Cloud Run и вы можете отправлять изображения Docker в реестр контейнеров Google. Я использую https://github.com/seenickcode/trivial-go-api для этого примера.
- `клон мерзавца git@github.com:seenickcode/trivial-go-api.git’
cd trivial-go-api
docker build -t gcr.io/<YOUR GCR PROJECT ID>/example .
docker push -t gcr.io/<YOUR GCR PROJECT ID>/example
- Перейдите в
console.cloud.google.com
Google Cloud Run > Создать новую службу >> выберите изображение pushed Docker со всеми параметрами по умолчанию >>> Выполнить - Показана ошибка:
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. Это по-прежнему отлично работает.