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

я бегу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

ошибка появляется здесь при запуске:

      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как последнийRUNcmd и, следовательно, не работает до конца

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

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

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

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

1 ответ

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

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

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

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

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

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

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

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

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

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

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

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

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