私が車を運転することを学んだとき、最初のレッスンで、インストラクターは交差点に戻り、それからあなたはそれをしてはいけないと言った。 このルールは、私がすぐに、そして一生覚えていました。
あなたはグリゴリー・オスターの子供たちへの「悪いアドバイス」を読んで、これができなかったことが子供たちにどれほど簡単に、そして自然にやってくるかを見ます。
Dockerfileを正しく書く方法についての記事がたくさん書かれています。 しかし、間違ったDockerfileを作成する方法についての説明はありませんでした。 このギャップを埋めます。 そして、多分私がサポートを得るプロジェクトでは、そのようなdockerfilesは少なくなるでしょう。
すべてのヒーロー、シチュエーション、およびdockerfileは架空のものです。 あなたが自分自身を認識した場合、申し訳ありません。
不気味で恐ろしいDockerfileを作成する
Peter(Senior java / ruby / php developer):同僚Vasily、新しいモジュールをDockerにすでにアップロードしていますか?
バジル(ジュニア):いいえ、わかりませんでした。このDockerではわかりません。 それに関する非常に多くの記事、私の目は大きく広がっています。
ピーター:1年前に締め切りがありました。 助けましょう、私たちはその過程でそれを見つけ出します。 そこでできないことを教えてください。
バジル:基本的な画像を最小限に抑えることはできませんが、必要なものはすべてありました。
ピーター:Ubuntuのイメージを考えてみてください。必要なものはすべて揃っています。 そして、それは多くの余計なことですが、それでも有用です。 そして、バージョンが常に最新になるように、最新のタグを置くことを忘れないでください。
そして、Dockerfileでは、最初の行が表示されます:
FROM ubuntu:latest
ピーター:次は何で、モジュールを何に書きましたか?
バジル:ルビー、そこにはWebサーバーといくつかのサービスデーモンが起動するはずです。
Peter:ええ、私たちに必要なものは:ruby、bundle、nodejs、imagemagickですので、他に何が...そして同時に、確実に新しいパッケージを入手するためにアップグレードしてください。
バジル:そして、ルートからではないように、ユーザーを作成しませんか?
ピーター:まあ、彼はまだ権利でだまされています。
Vasily:1つのチームですべてを成し遂げるには、約15分の時間が必要です。
(ピーターはきめ細かく、非常に賢い6月を無礼に中断します。)
Peter:別のコマンドで書いてください。読みやすくなります。
Dockerfileは成長しています:
FROM ubuntu:latest RUN apt-get update RUN apt-get upgrade RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full RUN gem install bundler RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs RUN bundle install --without development test --path vendor/bundle RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
その後、Igor Ivanovich、DevOps(ただしDevよりもOpsが多い)がオフィスに飛び込み、叫びました:
AI:Petya、あなたの開発者は再びprodデータベースを壊しました。いつ終わるのでしょうか....
少しの小競り合いの後、イゴール・イワノビッチは冷めて、彼の同僚がここで何をしているかを見つけ始めます。
AI:何をしていますか?
Basil:Peterは、新しいモジュール用にDockerfileをコンパイルするのを手伝ってくれました。
AI:見てみましょう...ここで何を書いているか、別のコマンドでリポジトリをクリーンアップします。これは追加のレイヤーです...しかし、Gemfileをコピーしなかった場合、どのように依存関係を設定しますか! とにかく、これはダメです。
ピーター:あなたのビジネスに行ってください、どうにかしてそれを理解します。
イゴール・イワノビッチは悲しそうにため息をつき、誰がデータベースを壊したのかを突き止めます。
ピーター:はい、でもコードについては、イメージにそれを押し込む必要があると彼は正しく言いました。 そして、sshとスーパバイザをすぐに配置しましょう。さもなければ、デーモンを起動します。
Vasily:次に、まずGemfileとGemfile.lockをコピーし、次にすべてを入れてから、プロジェクト全体をコピーします。 Gemfileが変更されない場合、レイヤーはキャッシュから取得されます。
ピーター:これらのレイヤーで何をしているのか、すべてを一度にコピーしてください。 すぐにコピーします。 最初の行。
Dockerfileは次のようになります。
FROM ubuntu:latest COPY ./ /app WORKDIR /app RUN apt-get update RUN apt-get upgrade RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor RUN gem install bundler RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs RUN bundle install --without development test --path vendor/bundle RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ピーター:次は何ですか。 スーパーバイザー用の設定はありますか?
バジル:いや、いや。 しかし、私はすぐにそれを行います。
ピーター:それから。 すべてを実行するinitスクリプトをスケッチしてみましょう。 ですから、それでsshをnohupで起動して、コンテナに接続して何が間違っているのかを確認できるようにします。 次に、スーパーバイザーも起動します。 さて、それから乗客を走らせてください。
Q:しかし、プロセスが1つあるはずだと読んだので、Dockerは何かが間違っていることを知り、コンテナーを再起動できます。
P:頭を悩ませないでください。 そして一般的に、どのように? すべてを1つのプロセスで実行するにはどうすればよいですか? イゴール・イワノビッチに安定性について考えさせてください。彼が給料を受け取ることは何もありません。 私たちのビジネスはコードを書くことです。 とにかく、Dockefileを書いてくれてありがとうと言ってください。
10分後、猫に関する2つのビデオ。
Q:私はすべてをしました。 コメントも追加しました。
P:見せて!
Dockerfileの最新バージョン:
FROM ubuntu:latest # COPY ./ /app WORKDIR /app # RUN apt-get update # RUN apt-get upgrade # RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor # bundler RUN gem install bundler # nodejs RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs # RUN bundle install --without development test --path vendor/bundle # RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # , , . CMD [“/app/init.sh”]
P:素晴らしい、私はそれが好きです。 そして、ロシア語のコメントは便利で読みやすく、誰もがそのように働くでしょう。 私はあなたにすべてを教えました、そしてあなたはあなた自身でそれをすることができます。 コーヒーを飲みに行きましょう...
さて、ここで私たちは絶対に恐ろしいDockerfileを手に入れました。イゴール・イワノビッチが辞めたいと思っているので、彼の目はもう一週間痛いでしょう。 もちろん、Dockerfileはさらに悪化する可能性があります。完璧に制限はありません。 しかし、初心者にとってはそうでしょう。
グレゴリー・オスターからの引用で終わりたいと思います:
まだしっかりしていない場合
彼らは人生の道を選びました
そして、あなたは理由がわかりません
始めよう
ポーチの明かりを破ります-
人々はありがとうと言うでしょう。
あなたは人々を助けます
電気を保護します。
UPD :コメントでは、これらのDockerfileの何が問題なのかを尋ねています。 先日、エラーの解析を含む別の記事を書きます。