Closed5

DockerによるFirefoxのビルドについて [供養]🙏

onihusubeonihusube

試行錯誤の末、Dockerfileはこうなった

FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
ENV SHELL /bin/bash
ENV PATH="/root/.cargo/bin:${PATH}"
RUN apt-get update \
    && apt-get install -qqy --no-install-recommends \
    wget \
    python3-pip \
    clang llvm \
    python3-dev \
    gcc
RUN pip3 install Mercurial
RUN wget https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py -O bootstrap.py --no-check-certificate
RUN python3 bootstrap.py --application-choice=browser --no-interactive
RUN apt-get -y clean \
    && rm -rf /var/lib/apt/lists/*
COPY ./mozconfig mozconfig
ENV MOZCONFIG /mozconfig
WORKDIR /mozilla-unified

(正確には動いたものから少し剪定しているので何か間違ったたらごめんね・・・)

bootstrap.py実行中に依存関係の自動解決が行われ、そこでaptが使用されるためaptのリストをクリアするのはその後としている。

Dockerfileと同じディレクトリにあるmozconfigファイル(ビルドオプションを記述する)をコピーして、その場所をコンテナ内環境変数MOZCONFIGにセットすると、ビルド時にオプションを適用することができる。必要ない場合はCOPY ./mozconfig mozconfigを消すか、空のファイルを用意しておく。

ビルドは例えばdocker build -t ffbuildenv .のようにする。

onihusubeonihusube

ビルド完了後、コンテナ内の/mozilla-unified以下にセットアップ済みソースコードが残されている。

ここで引っ張ってきてセットアップしているソースコードはmozilla-centralと呼ばれる最新の一応は安定しているというソースコードで、ビルドは通るもののα版扱い。安定している別のソースコードを持ってくる場合は内部にマウントしていくつか手順が必要。

例えば、Dockerfileと同じディレクトリにsrcというディレクトリを作ってその中にソースコードを配置した時

$ docker run -it -v $(PWD)/src:/src ffbuildenv
$ cd /src
$ ./mach bootstrap --application-choice=browser --no-interactive
$ ./mach build

(これは試してないので不確実だけれど)ビルド前に./mach bootstrapを行わないとダメらしい、String.hがねーよとか言われる。ここでのbootstrapはさっきのbootstrap.pyと同じことをしているっぽい

onihusubeonihusube

セットアップ済ソースでビルドする場合は以下

$ docker run -it ffbuildenv
$ cd /mozilla-unified
$ ./mach build

ビルドはそこそこ時間がかかる。

ビルド成功後、成果物は/mozilla-unified/obj-x86_64-pc-linux-gnu/dist/binディレクトリにある。

この/mozilla-unified/obj-x86_64-pc-linux-gnuディレクトリをobjdirとか呼ぶらしい。objdirは環境によって変わると思う。

onihusubeonihusube

出来たものを取り出し可搬にするためにtarballにまとめることができる。

ビルド完了後のコンテナ内で

$ cd /mozilla-unified/obj-x86_64-pc-linux-gnu
$ make -C browser/installer/

とすると、/mozilla-unified/obj-x86_64-pc-linux-gnu/distの直下にfirefox-89.0a1.en-US.linux-x86_64.tar.bz2のようなものができる。これを持ち出して展開すると展開さきでfirefoxが使える。

ここには依存関係がほとんど含まれているようだ。

なおこの時、外と繋がってるディレクトリが無いと取り出すのが難しそう。私はVSCodeのDocker拡張を使って起動中のコンテナのファイルシステムにアクセスして取り出した・・・

onihusubeonihusube

もう少し自動化とかできそうだけど、用済みになってしまったのでここで終わり。

このスクラップは2021/04/09にクローズされました