インフラ系専門学生の日記Privacy Policy

ICTSC2020予選write-up

ICTSC2020予選お疲れ様でした。

予選では華麗なVimさばきで問題をバッタバッタと薙ぎ倒しましたクソザコイキリマンです。

予選で僕が解いた問題について所感を並べていきたいと思います。

目次

問題1 networkが作成できない?

解説ページ

docker-composeにおけるNetwork問題です。

問題1 想定解

dockerd側のIPv4 Prefixを変更するらしいです。というか僕自身最初はそれでやろうとしたんですが、上手くいかなかったので路線変更しました。

問題1 提出した回答

docker-compose.yml の方を書き換える事にしました。実際は問題の条件(docker0以外のIPを変更しない)としてはかなり怪しかったのですが、無事満点取れたのでほっとしました。

実際には以下の設定を追記しました。

networks:
  default:
    driver: bridge
    ipam:
      config:
        - subnet: 10.0.0.0/8

これで無事立ち上がりはするのですが、docker0のIPは変わらず、コンテナのブリッジ用デバイスのIPv4プレフィックスが変わっていたのでなんだかなという感じです。

問題2 WEBページが見れない

解説ページ

Apache + SELinux問題だったみたいです。僕はApache側でゴリ押しした結果点を落としました。

問題2 想定解

SELinuxのラベルをディレクトリ側に設定して、Apache側のアクセス許可設定をするみたいです。

SELinuxのラベルでどうにかなりそうというのは分かっていたのですが、めんどくさかったのでApache側でどうにかならないかと思ったらなってしまった次第。

問題2 提出した回答

で、それがその回答。

/etc/httpd/conf.d/userdir.conf の31行目を書き換えただけ。

- <Directory "/home/*/public_html">
+ <Directory "/home/*/html">

これでhtmlが正常に返ってきてしまいました。一応、部分点は貰えたので良かったんですが、皆さんは横着しないようにしましょうね!

問題3 ダイエットしようぜ!

解説ページ

コンテナダイエット問題。多分これが一番小さいと思います。

問題3 想定解

解説ページにある限りでは3つの解法を想定していたみたいです。

  1. ベースイメージをalpineベースのものに変える
  2. docker-slimを使う
  3. マルチステージビルドを使う

問題3 提出した回答

3つ目のマルチステージビルドで回答しました。基本的に想定解通りなので詳しく説明はしません。

ぶっちゃけ説明不要の問題。

問題4 またビルド失敗しちゃった~…

Dockerのマルチステージビルド環境におけるGoのライブラリ問題です。

問題4 想定解

想定解としては、「ライブラリを明示的に静的リンクに設定する」らしいです。実際多くのチームがそうしたでしょうし、解説にもそう書いてあります。

ぶっちゃけ説明不要な問題ですが、解説において「面白い想定外解法」と言及されている回答がありました。

「動的リンクのまま、 ldd コマンドを使用し依存しているライブラリを特定して、そのライブラリを builder コンテナから実行用のコンテナにコピー・配置する」という解法です。

実はこれ、僕がやった解法とちょっとだけ違っていていまいち自信がないのですが、これで「1チームだけ」「面白い」とされているので、多分僕の回答だろうという事で、この解法について解説したいと思います。

問題4 提出した回答

ldd コマンドで app の依存関係を確認したら /lib64/ld-linux-x86-64.so.2 という存在しないライブラリに依存していた事が判明。

なので、Alpine Linux上で該当ライブラリと互換性を持つ /lib/ld-musl-x86_64.so.1 にシンボリックリンクを張った、というのが僕の解法です。

最終的なDockerfileはこんな感じです。

FROM alpine:3.12
COPY --from=builder /app .
+ RUN mkdir /lib64 && ln -s /lib/ld-musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
EXPOSE 1323
ENTRYPOINT ["./app"]

元の問題文には 1,9,12行目は変更するな と書いてあり、この解法だと行番号が変わってしまっているので問題への解法としては適切ではないですし、ぶっちゃけこのやり方自体かなりevilなので、あまりやらない方がいいと思います。

ちなみに部分点しか貰えませんでした。

以上、GoでHello, Worldすらやった事なかったクソザコナメクジの苦肉の策でした。

問題11 jsonが壊れた!!

解説ページ

Go問題。ぶっちゃけGo要素あまりなかった気がする。

これに関しては特に解説とかしません。解説ページそのままの回答です。

ただ一言、 Gopherくんはjsonを壊しませんが、プログラマはjsonを壊します。

これが言いたかっただけ。

まとめ

基本的に下手な鉄砲なんとやらのつもりで数だけこなしたので、部分点しか貰えなかった問題に関してはしゃーなし感があります。

それはそれとして、ちゃんと満点貰えるようにはしたいのでそこは反省点。

本戦ではもう少し踏み込んだ所までやって満点問題を増やしたいところ。