今度は、Apple 謹製で、iOS や Mac 向けのアプリを作るのに利用されている、Swift にチャレンジ。
X Code 入ったMBPなんで、もう普通にMacでプログラミングしたほうが良いんだろうけど、モノは試しなので、Docker上に作れないか、試してみる。
Docker Hubには、オフィシャルのSwift イメージも公開されている模様。このイメージは Dockerfile も公開されているので、それを見ながら作っていくということもできそう。
ただ、公式サイトでもサポートされているディストリビューションは Ubuntu のみと書かれていて、公式イメージもUbuntuベースのもの。
公式イメージのDockerfileや公式サイトの手順を参考に以下のようなDockerfileを作ってみたが、ビルド中にエラーとなってしまう。
FROM ubuntu:latest RUN apt-get -q update && \ apt-get install clang libicu-dev && \ wget https://swift.org/builds/swift-5.0.1-release/ubuntu1804/swift-5.0.1-RELEASE/swift-5.0.1-RELEASE-ubuntu18.04.tar.gz && \ wget https://swift.org/builds/swift-5.0.1-release/ubuntu1804/swift-5.0.1-RELEASE/swift-5.0.1-RELEASE-ubuntu18.04.tar.gz.sig && \ wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import - && \ gpg --keyserver hkp://pool.sks-keyservers.net --refresh-keys Swift && \ gpg --verify swift-5.0.1-RELEASE-ubuntu18.04.tar.gz.sig && \ tar xzf swift-5.0.1-RELEASE-ubuntu18.04.tar.gz && \ export PATH=/usr/local/swift/usr/bin:"${PATH}" CMD ["/bin/sh"]
エラーとしては「After this operation, 737 MB of additional disk space will be used.」というもので、要はディスク容量が足りないっていうエラー。
Dockerfileで一気にビルドせずに、Ubuntuのベースで一旦コンテナを起動し、同じ様にコマンドを叩いていくと、同じエラーは出るものの、エラーの次に出る「Do you want to continue? [Y/n] 」というプロンプトで”Y”を選択して先に進めるから、おそらくその時点でコンテナが使うディスク容量を拡張してくれてると思われるが、Dockerfileで一気にビルドすると、ここで”Abort”となってしまう。
で、調べていくと、下記のような情報に行き当たった。
https://qiita.com/python_spameggs/items/66f6bbe4b97be55f8b65
ここから判断すると、デフォルトのコンテナ容量が小さめで、UbuntuベースでHackやSwiftのコンテナを作ろうとしたときにすぐに上限に達してしまうのがエラーの原因のようだ。
で、上記のページでは、デフォルトの容量を拡張して対処をしている模様。
が、Dockerのバージョンが古い時期の情報のせいか、「storage-opt」に「dm.basesize」の値を設定するだけではダメっぽい。(というか、この設定追加しただけだと、dockerのデーモンがFatal Errorを起こし、設定を全部初期化せざるを得ない。
https://github.com/docker/for-mac/issues/2134
上記ページで、同じような症状の報告が上がってた。
確かに、docker info で確認してみると、storage driver はlayer2になっているので、devicemapper 用の「dm.basesize」が使えないのはわかった。layer2の場合は、「overlay2.size」という項目になっている。
しかし、このオプションを設定しただけでは、ハングする。
このオプションを使うには、backing filesystem が「xfs」 であり「pquota」というオプション付きでマウントされてないとダメ・・・という記述がある。(公式ドキュメントより)
けど、そんなオプションどこでつけるかは公式にも載ってない。
流石に、詰んだかな?コレは。
ちなみに、オフィシャルのSwift イメージをそのままpullして使う分には、何の問題もない。
$ docker run --privileged -itd --rm swift /bin/bash $ docker exec -it hoge bash # swift --version Swift version 5.0.1 (swift-5.0.1-RELEASE)