Флаттер паб не работает в докере

я запускаю docker pull cirrusci/flutter:stable, чтобы получить чистый докер с установленным андроидом и флаттером

моя система представляет собой m1 mac с macOS 12.6 и

1m1@1m1s-MacBook-Air ~ % docker --version
Docker version 20.10.17, build 100c701

работает docker run -it image_id /bin/bash выдает предупреждение:

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

внутри докера flutter --version дает

root@74a20a5b7edf:/# flutter --version
Flutter 3.3.1 • channel unknown • unknown source
Framework • revision 4f9d92fbbd (10 days ago) • 2022-09-06 17:54:53 -0700
Engine • revision 3efdf03e73
Tools • Dart 2.18.0 • DevTools 2.15.0

ошибка возникает здесь при запуске flutter doctor --android-licenses:

root@74a20a5b7edf:/# flutter doctor --android-licenses

===== CRASH =====
si_signo=Segmentation fault(11), si_code=1, si_addr=0x7
version=2.18.0 (stable) (Fri Aug 26 10:22:54 2022 +0000) on "linux_x64"
pid=173, thread=217, isolate_group=main(0x400305f000), isolate=main(0x40030d6000)
isolate_instructions=4001ece300, vm_instructions=4001ece300
  pc 0x0000ffffa600472b fp 0x00000040103d51f0 Unknown symbol
  pc 0x0000ffffa4b37411 fp 0x00000040103d5228 Unknown symbol
  pc 0x0000ffffa54561fd fp 0x00000040103d5268 Unknown symbol
  pc 0x0000ffffa4b37248 fp 0x00000040103d52c8 Unknown symbol
  pc 0x0000ffffa58672e9 fp 0x00000040103d5318 Unknown symbol
  pc 0x0000ffffa5d7f3b3 fp 0x00000040103d5360 Unknown symbol
  pc 0x0000ffffa5d7f02b fp 0x00000040103d53a0 Unknown symbol
  pc 0x0000ffffa5d7ef59 fp 0x00000040103d53c8 Unknown symbol
  pc 0x0000ffffa5d7ee7e fp 0x00000040103d5408 Unknown symbol
  pc 0x0000ffffa5d22c38 fp 0x00000040103d5448 Unknown symbol
  pc 0x0000ffffa6002a0c fp 0x00000040103d54c0 Unknown symbol
  pc 0x00000040020464bd fp 0x00000040103d5560 dart::DartEntry::InvokeCode(dart::Code const&, unsigned long, dart::Array const&, dart::Array const&, dart::Thread*)+0x14d
  pc 0x00000040020462fc fp 0x00000040103d55c0 dart::DartEntry::InvokeFunction(dart::Function const&, dart::Array const&, dart::Array const&, unsigned long)+0x14c
  pc 0x000000400204872c fp 0x00000040103d5610 dart::DartLibraryCalls::HandleMessage(long, dart::Instance const&)+0x14c
  pc 0x000000400206fda0 fp 0x00000040103d5ba0 dart::IsolateMessageHandler::HandleMessage(std::__2::unique_ptr<dart::Message, std::__2::default_delete<dart::Message> >)+0x350
  pc 0x00000040020992cd fp 0x00000040103d5c10 dart::MessageHandler::HandleMessages(dart::MonitorLocker*, bool, bool)+0x14d
  pc 0x00000040020999af fp 0x00000040103d5c60 dart::MessageHandler::TaskCallback()+0x1df
  pc 0x00000040021bc868 fp 0x00000040103d5ce0 dart::ThreadPool::WorkerLoop(dart::ThreadPool::Worker*)+0x148
  pc 0x00000040021bccbd fp 0x00000040103d5d10 dart::ThreadPool::Worker::Main(unsigned long)+0x6d
  pc 0x000000400212f488 fp 0x00000040103d5dd0 /sdks/flutter/bin/cache/dart-sdk/bin/dart+0x212f488
-- End of DumpStackTrace
qemu: uncaught target signal 6 (Aborted) - core dumped
Aborted

на самом деле, Dockerfile (https://github.com/cirruslabs/docker-images-flutter/blob/master/sdk/Dockerfile) имеет flutter doctor --android-licenses в качестве последнего RUN cmd и, следовательно, не может работать до конца

в других экспериментах flutter pub get терпит неудачу, пытаясь начать с чистого debian, используя diff-архитектуры

у меня такое ощущение, что cirrusci/flutter терпит неудачу из-за какой-то проблемы, связанной с моей системой, являющейся arm/m1 (хотя моя система новая/чистая) ~ возможно, докер не получает интернет? но wget https://google.com работает ~ какой порт использует flutter pub get? но даже если я запускаю открытый докер docker run --network host, та же ошибка сохраняется

в конечном счете, я пытаюсь настроить ci для своего приложения для Android на флаттере.

что делать? почему cirrusci/flutter:stable не работает на m1?

0
0
238
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ответ почему не работает на М1

Как вы сами заметили, вы запускаете сборку докера на основе образа, который был собран для другой платформы, т.е. вы используете arm64, но образ linux/amd64. Это означает, что докер будет запускать его, но со слоем эмуляции, а именно qemu.

Некоторая несовместимость между Dart и qemu, похоже, является проблемой. В опубликованной вами трассировке стека qemu аварийно завершает работу, когда среда выполнения Dart пытается выполнить InvokeCode(). На самом деле это зарегистрированная проблема, см., например.

ответьте что делать

Разработчики Dart не планируют проводить дальнейший анализ, так как проблема связана с qemu, и проблема не была воспроизведена с qemu вне докера.

Также следует отметить, что docker с qemu предоставляется только в качестве максимальных усилий, и сам проект docker вряд ли решит проблему, даже если об этом будет сообщено.

Я не нашел поданной проблемы для самого qemu.

В основном есть два варианта:

Делайте это без qemu, то есть встраивайте контейнер linux/arm64.

В некоторой степени это сработает в отношении флаттера, но следующее, с чем вам придется столкнуться, — это Android-сборка для Linux, которая представляет собой совершенно новую банку червей. См., например. средство отслеживания ошибок Google для Android, Пожалуйста, поддержите Linux aarch64 для создания приложений и других.

Делайте сборку без оборудования arm/M1

Как ни грустно осознавать это, в данном случае это может быть простым решением не выполнять перекрестную сборку, по крайней мере, для флаттера с целью сборки Android. И, вероятно, также логично, если вы хотите предоставить совместимый с Intel образ докера для коллег и / или CI, которые могут не запускать M1. В конечном счете, вопрос в том, какая у вас эталонная платформа сборки.

Я думаю, легко упустить из виду, что когда проекты предоставляют SDK, совместимые с M1 (например, flutter и Android Studio!), Это не означает, что вы можете запускать этот код M1 (который зависит от времени выполнения MacOS) в контейнере докеров на M1. Также нет гарантии, что qemu всегда будет работать для запуска кода linux/amd64 на M1 в докере. (Предупреждения легко пропустить, пока они не станут ошибками, верно?)

sebkraemer 30.09.2022 14:56

Другие вопросы по теме