[悲報]Dockerfile、生モノだった

新4年生になった遠藤です。最近、8年近く付き合いのあったPCをとうとう新調して、the elder scrolls v skyrimのMOD環境も3年ぶりに更新しました。
グラボ機能無いCPUを購入したのにGPU付けるの後回しにした結果、マザボ起動しなくて滅茶苦茶焦ったり、直近3年間でSkyrimのアクションMOD周り滅茶苦茶進化しててMOD環境大幅更新することになったり、その時にゴミファイル残った事に気づかなくてDodge系MODが機能しなくて土日ずっと頭抱えてたりと、研究と就活でただでさえ大変なのにプライベートでもドタバタしてて中々落ち着かない日々を過ごしていました。

私の書くブログ記事ってこんな感じのゲーム話ばっかりで、このブログ一応技術ブログなのに技術的な事書いた事無かったなと思い、私の卒業課題テーマであるDockerfileと、調べてみたらDockerfileは長時間経つと腐る個体が存在する事実に驚いた事について、少し語りたいと思います。

そもそもDockerfileというのは、Dockerのメインコンテンツであるコンテナを作るための設計図を作るための手順書です。
Dockerfile(イメージを作る手順書)→DockerImage(コンテナの設計図)→DockerContainer(プログラムと必要なデータだけ入った箱)という流れでDockerは運用する感じです。

Dockerは「どのパソコンでも同じ環境で同じプログラムを動作できる」のが売り(これを「再現性」と呼びます)で、どんなパソコン上でも同じDockerImageさえ使えば、中身がまったく同じDockerContainer君を作り出せる訳です。
別に他のPCにプログラムコピペさせれば良くね?って疑問も浮かぶかと思いますが、プログラムだけ移動させたら、そのPCにインストールしてたライブラリのバージョンが違うせいでプログラム動かねぇ!とか普通にあります。Dockerを使えば、プログラムを動かすための環境の用意まで自動化するので、そういったトラブルは減ります。
私は友人達とMOD入れてオンラインでゲームやる事結構あって、よく私が人柱した後友人がMODを導入するのですが、その時に何故かバージョン違うせいで動かない奴とか導入方法を盛大にミスって動かない奴が最低1人は出るんですよ何故か……。そういう、いわゆる「おま環」って奴をブチ〇せるのがDockerを筆頭とするコンテナ技術です。

で、今回したい話はその「再現性」にまつわる話なんです。

Dockerを使っていれば開発者の想定したコンテナ内環境でプログラムを動かせるはずなんですけど、Githubから引っ張ってきたDockerfileを使おうとすると、ちらほらエラー吐くDockerfile君が居るんですよねそのせいで実験できなくてこっちが血反吐吐きかけましたよ。流石に壊れたファイル上げる人は居ないですし、Dockerfile自体は共通のDockerカーネルで動くのでおま環でも無い。じゃあなんで?って話になったんです。

で、Dockerfile繋がりでこの論文を読んでたら衝撃の事実を知ります。Githubにアップロードされてる★10以上ついてるDockerfileのうち、なんと全体の約25%がエラー吐くんです。なんで再現性が確保されてねぇんだよ、教えはどうなってんだ教えは!と思いましたね。
で、その原因の多くは、バージョンが勝手に更新して自爆 or URLからダウンロードする予定がURLが死去してた、の2通りです。他にもファイル変更した後にDockerfileも編集するのを忘れてエラーとかあります。何も考えずにこの2つの地雷踏むと、作ったDockerfileには消費期限のラベルが貼られる事になります。つまりいつか腐ります。私の場合はURLが腐ってました。
その結果、Githubにある約25%のDockerfileから腐乱臭漂う大惨事が起きている訳です。これヤバイのが、★9以下の雑魚は含まれてない事なんですよね。ちゃんとしたプロジェクトの約25%は再現性がクソでMyPCじゃおま環されるって考えると結構由々しき事態です。

お願いなのでこの記事を見てる皆さんはDockerfileを書く時に、なるべく長い間使える保存料たっぷりケミカルDockerfileに焼き上げるように意識することをお願い申し上げます。食品添加物0のオーガニックなDockerfileは止めてください
バージョンやライブラリを固定したり、ADDコマンドでURL使ってダウンロードはなるべく控えるだけでも変わるかと思います。定期的にDockerfileを保守すればこんな悲惨な事起きないんですけど、ぶっちゃけ面倒なので、最初に良いDockerfile書いて後で楽をしましょう。

まとめ・おまけ:
なんでDockerfileの再現性が確保されてねぇんだよ
教えはどうなってんだ教えは
お前ら”ver:latist”とか”ADD http://”とかを平気で使ってるじゃねぇか
(将来も同じ物が使えるとは限らないと)分かってんのか!?
「Build Error」が生まれたのはエンジニアがインターネット不老不死神話に甘えたせいだろうが
ちゃんと保守してんのかよ!?
くそったれ!

コメントを残す