😱

Docker for Mac M1でSystem Spec沼にハマった話

2022/03/16に公開

この記事を読んで参考になるかもしれない方

  • M1版MacのDocker上でsystem spec実行したい方
  • M1版MacのDocker上でgoogle-chromeを起動したい方

背景

https://zenn.dev/kenkenlysh/articles/c84ec0110a71e6

この前、intel版MacからM1版Mac(以下、M1)へ買い替えを行いました。
普段、仕事ではRailsとDockerでWebアプリを開発しています。M1上で、JSの処理が必要なsystem specを実行したいと思い、ここ1ヶ月くらい実装方法を調べていました。

前提条件

PC: M1 Mac OS ver.12.1
Docker for Mac: ver.4.5.0
Rails: 6

どうやって実装しようと考えたか

Docker上で、system specを実行したい場合、実装方法は2択あります。

  1. 同居する方法
    Railsが入っているコンテナへgoogle-chromeとchromedriverを、インストールし実行する。

  2. 別居する方法
    Railsが入っているコンテナと別で、google-chromeがインストールしてあるコンテナを起動して、system specを実行する

今回、私は1の方法で、system specを実行したいと考えていました。
別でコンテナを立てる場合、1GBあるコンテナ(イメージ:selenium/standalone-chrome:98.0-chromedriver-98.0-20220217)を起動させないといけないため、google-chromeをRailsが入っているコンテナへインストールしようと決めました。

https://hub.docker.com/layers/selenium/standalone-chrome/98.0-chromedriver-98.0-20220217/images/sha256-afb28437412e22aab5024f649b5650a251bd2b50d2c2206c04fa3f271675bea9?context=explore

以下のコードでdocker-compose buildを実行する。

FROM cimg/ruby:2.7.2-node
ARG user=root
ENV LANG C.UTF-8

USER root

SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
RUN sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

RUN sudo apt update && sudo apt install -y --no-install-recommends \
  google-chrome-stable
RUN sudo rm -rf /var/lib/apt/lists/*
RUN wget -P /tmp https://chromedriver.storage.googleapis.com/99.0.4844.51/chromedriver_linux64.zip
WORKDIR /tmp
RUN unzip chromedriver_linux64.zip
RUN sudo mv chromedriver /bin/
RUN rm chromedriver_linux64.zip

ENV EDITOR vi
ENV APP_PATH /app

WORKDIR $APP_PATH
RUN echo 'gem: --no-document' > ~/.gemrc

EXPOSE 4000

COPY entrypoint.sh /usr/bin/
RUN sudo chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

CMD ["bash"]

コンテナを立ち上げます。そして、google-chromeを起動します。
すると、即座にcore dumpします。泣
なんで、すぐに落ちるのかを調査していたところ、同じことで悩んでいる方がいました。
もっと早くこの記事に出会いたかった。。。
https://blog.savanna.io/entry/2021/12/06/182102

# google-chrome --headless --disable-gpu --no-sandbox http://b.hatena.ne.jp/
qemu: uncaught target signal 5 (Trace/breakpoint trap) - core dumped
qemu: uncaught target signal 5 (Trace/breakpoint trap) - core dumped
[0316/103025.934701:ERROR:file_path_watcher_linux.cc(321)] inotify_init() failed: Function not implemented (38)
[0316/103025.925859:ERROR:bus.cc(397)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory
[0316/103025.947169:ERROR:bus.cc(397)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory
qemu: unknown option 'type=utility'
[0316/103026.178458:WARNING:bluez_dbus_manager.cc(248)] Floss manager not present, cannot set Floss enable/disable.
[0316/103026.180096:ERROR:gpu_process_host.cc(966)] GPU process launch failed: error_code=1002
[0316/103026.180516:WARNING:gpu_process_host.cc(1277)] The GPU process has crashed 1 time(s)
[0316/103026.206643:ERROR:network_service_instance_impl.cc(978)] Network service crashed, restarting service.
qemu: unknown option 'type=utility'
[0316/103026.507754:ERROR:gpu_process_host.cc(966)] GPU process launch failed: error_code=1002
[0316/103026.507846:WARNING:gpu_process_host.cc(1277)] The GPU process has crashed 2 time(s)
[0316/103026.518709:ERROR:network_service_instance_impl.cc(978)] Network service crashed, restarting service.
qemu: unknown option 'type=utility'
[0316/103026.591422:ERROR:gpu_process_host.cc(966)] GPU process launch failed: error_code=1002
[0316/103026.591512:WARNING:gpu_process_host.cc(1277)] The GPU process has crashed 3 time(s)
[0316/103026.616152:ERROR:network_service_instance_impl.cc(978)] Network service crashed, restarting service.
[0316/103026.637698:ERROR:gpu_process_host.cc(966)] GPU process launch failed: error_code=1002
[0316/103026.637788:WARNING:gpu_process_host.cc(1277)] The GPU process has crashed 4 time(s)
qemu: unknown option 'type=utility'
[0316/103026.659217:ERROR:gpu_process_host.cc(966)] GPU process launch failed: error_code=1002
[0316/103026.659304:WARNING:gpu_process_host.cc(1277)] The GPU process has crashed 5 time(s)
[0316/103026.662702:ERROR:network_service_instance_impl.cc(978)] Network service crashed, restarting service.
qemu: unknown option 'type=utility'
[0316/103026.693878:ERROR:gpu_process_host.cc(966)] GPU process launch failed: error_code=1002
[0316/103026.694152:WARNING:gpu_process_host.cc(1277)] The GPU process has crashed 6 time(s)
[0316/103026.694583:FATAL:gpu_data_manager_impl_private.cc(447)] GPU process isn't usable. Goodbye.
[0316/103026.697321:ERROR:scoped_ptrace_attach.cc(27)] ptrace: Function not implemented (38)
qemu: uncaught target signal 5 (Trace/breakpoint trap) - core dumped

結論

答えとしては、M1 のDocker上で、google-chromeを起動して、JSの処理が必要なsystem specをテストすることは、現在できないです。
google-chromeのarm版がリリースされるかDocker for Macが改修されるのを待つしかなさそうです。。。

Discussion