通垞の Dockerfile を䜿甚しお、werf で Docker むメヌゞを構築できるようになりたした

遅刻しないよりはマシです。 あるいは、アプリケヌション むメヌゞを構築するための通垞の Dockerfile をサポヌトしおいないずいう重倧な間違いを犯すずころでした。

通垞の Dockerfile を䜿甚しお、werf で Docker むメヌゞを構築できるようになりたした

に぀いお話したしょう ワヌフ — あらゆる CI/CD システムず統合し、アプリケヌションのラむフサむクル党䜓の管理を提䟛する GitOps ナヌティリティにより、次のこずが可胜になりたす。

  • 画像を収集しお公開し、
  • Kubernetes にアプリケヌションをデプロむし、
  • 特別なポリシヌを䜿甚しお未䜿甚のむメヌゞを削陀したす。


このプロゞェクトの理念は、䜎レベルのツヌルを XNUMX ぀の統合システムに集め、DevOps ゚ンゞニアがアプリケヌションを制埡できるようにするこずです。 可胜であれば、既存のナヌティリティ (Helm や Docker など) を䜿甚する必芁がありたす。 問題に察する解決策がない堎合は、そのために必芁なものをすべお䜜成しおサポヌトしたす。

背景: 独自の画像コレクタヌ

これが werf のむメヌゞ コレクタヌで起こったこずです。通垞の Dockerfile では十分ではありたせんでした。 プロゞェクトの歎史をざっず芋おみるず、この問題は werf の最初のバヌゞョンですでに発生しおいたした (その埌も ダップずしお知られおいたす).

アプリケヌションを Docker むメヌゞに構築するツヌルを䜜成しおいるずきに、Dockerfile がいく぀かの非垞に特殊なタスクには適しおいないこずにすぐに気づきたした。

  1. 次の暙準スキヌムに埓っお、兞型的な小芏暡な Web アプリケヌションを構築する必芁がありたす。
    • システム党䜓のアプリケヌションの䟝存関係をむンストヌルし、
    • アプリケヌションの䟝存関係ラむブラリのバンドルをむンストヌルしたす。
    • 資産を集め、
    • そしお最も重芁なこずは、むメヌゞ内のコヌドを迅速か぀効率的に曎新するこずです。
  2. プロゞェクト ファむルに倉曎が加えられた堎合、ビルダヌは倉曎されたファむルにパッチを適甚しお新しいレむダヌを迅速に䜜成する必芁がありたす。
  3. 特定のファむルが倉曎された堎合は、察応する䟝存ステヌゞを再構築する必芁がありたす。

珟圚、私たちのコレクタヌには他にも倚くの可胜性がありたすが、これらは圓初の願望ず衝動でした。

䞀般に、私たちはよく考えずに、䜿甚したプログラミング蚀語で歊装したした。 䞋蚘参照 そしお実装に向けお出発したす 独自のDSL 目的に埓っお、アセンブリ プロセスを段階的に蚘述し、これらの段階のファむルぞの䟝存関係を刀断するこずを目的ずしおいたした。 そしおそれを補完した 自分のコレクタヌ、DSL を最終目暙、぀たり組み立おられたむメヌゞに倉えたした。 圓初、DSL は Ruby で䜜られおいたしたが、 Golang ぞの移行 — コレクタヌの構成が YAML ファむルで蚘述され始めたした。

通垞の Dockerfile を䜿甚しお、werf で Docker むメヌゞを構築できるようになりたした
Ruby の dapp の叀い構成

通垞の Dockerfile を䜿甚しお、werf で Docker むメヌゞを構築できるようになりたした
YAML 䞊の werf の珟圚の構成

コレクタヌのメカニズムも時代ずずもに倉化したした。 最初は、構成から䞀時的な Dockerfile をオンザフラむで生成するだけで、次に䞀時コンテナヌでアセンブリ呜什を実行しおコミットを開始したした。

NB: 珟時点では、(YAML での) 独自の構成で動䜜し、Stapel コレクタヌず呌ばれるコレクタヌは、すでにかなり匷力なツヌルに開発されおいたす。 詳现な説明は別の蚘事に倀したす。基本的な詳现に぀いおは、以䞋を参照しおください。 ドキュメンテヌション.

問題意識

しかし、私たちはすぐには気づきたせんでしたが、XNUMX ぀の間違いを犯したこずに気づきたした。それは、機胜を远加しなかったこずです。 暙準の Dockerfile 経由でむメヌゞをビルドする そしおそれらを同じ゚ンドツヌ゚ンドのアプリケヌション管理むンフラストラクチャに統合したす (぀たり、むメヌゞを収集し、展開し、クリヌンアップしたす)。 Dockerfile サポヌトを実装せずに、Kubernetes でデプロむするためのツヌルを䜜成するこずがどのように可胜でしょうか。 ほずんどのプロゞェクトで画像を蚘述する暙準的な方法?

この質問に答える代わりに、解決策を提䟛したす。 すでに Dockerfile (たたは䞀連の Dockerfile) があり、werf を䜿甚したい堎合はどうすればよいでしょうか?

NBずころで、なぜwerfを䜿いたいず思ったのですか 䞻な機胜は次のずおりです。

  • むメヌゞのクリヌニングを含む完党なアプリケヌション管理サむクル。
  • 単䞀の構成から耇数のむメヌゞのアセンブリを䞀床に管理する機胜。
  • Helm 互換チャヌトのデプロむメントプロセスが改善されたした。

それらのより完党なリストは、次の堎所にありたす。 プロゞェクトペヌゞ.

したがっお、以前に構成内の Dockerfile を曞き換えるこずを提案しおいたずしおも、今では喜んで「werf に Dockerfile を構築させたしょう!」ず蚀うでしょう。

どのように䜿甚する

この機胜の完党な実装はリリヌスに蚘茉されおいたす ワヌフ v1.0.3-beta.1。 䞀般的な原則は単玔です。ナヌザヌは werf config で既存の Dockerfile ぞのパスを指定し、コマンドを実行したす。 werf build...それだけです - werf が画像を組み立おたす。 抜象的な䟋を芋おみたしょう。

次回も発衚したしょう Dockerfile プロゞェクトルヌト内:

FROM ubuntu:18.04
RUN echo Building ...

そしお発衚したす werf.yamlこれを䜿甚するのは Dockerfile:

configVersion: 1
project: dockerfile-example
---
image: ~
dockerfile: ./Dockerfile

党お å·Š 走る werf build:

通垞の Dockerfile を䜿甚しお、werf で Docker むメヌゞを構築できるようになりたした

さらに、次のように宣蚀するこずもできたす werf.yaml 異なる Dockerfile から耇数のむメヌゞを䞀床に構築するには:

configVersion: 1
project: dockerfile-example
---
image: backend
dockerfile: ./dockerfiles/Dockerfile-backend
---
image: frontend
dockerfile: ./dockerfiles/Dockerfile-frontend

最埌に、次のような远加のビルド パラメヌタヌの受け枡しもサポヌトしたす。 --build-arg О --add-host - werf config経由。 Dockerfile むメヌゞ構成の完党な説明は、次の堎所で参照できたす。 ドキュメントペヌゞ.

それはどのように動䜜したすか

ビルド プロセス䞭、Docker のロヌカル レむダヌの暙準キャッシュが機胜したす。 しかし、重芁なこずは、ノェルフもたた、 Dockerfile 構成をむンフラストラクチャに統合したす. これは䜕を意味するのでしょうか

  1. Dockerfile から構築された各むメヌゞは、ず呌ばれる XNUMX ぀のステヌゞで構成されたす。 dockerfile (werf にどのようなステヌゞがあるかに぀いお詳しく読むこずができたす) ここで).
  2. ステヌゞ甚 dockerfile werf は、Dockerfile 構成の内容に応じお眲名を蚈算したす。 Dockerfile 構成が倉曎されるず、ステヌゞ眲名が倉曎されたす dockerfile そしお、werf は新しい Dockerfile 構成を䜿甚しおこのステヌゞの再構築を開始したす。 眲名が倉曎されない堎合、werf はキャッシュから画像を取埗したす。 (werf での眲名の䜿甚に぀いおの詳现は、次のセクションで説明されおいたす) このレポヌト).
  3. 次に、収集した画像をコマンドで公開できたす。 werf publish たたは werf build-and-publish) を䜜成し、Kubernetes ぞのデプロむメントに䜿甚したす。 Docker レゞストリに公開されたむメヌゞは、暙準の werf クリヌンアップ ツヌルを䜿甚しおクリヌンアップされたす。 叀いむメヌゞ (N 日より叀い)、存圚しない Git ブランチに関連付けられたむメヌゞ、およびその他のポリシヌは自動的にクリヌンアップされたす。

ここで説明する点の詳现に぀いおは、次のドキュメントを参照しおください。

泚意事項ず泚意事項

1. 倖郚 URL は ADD ではサポヌトされおいたせん

珟圚、ディレクティブでの倖郚 URL の䜿甚はサポヌトされおいたせん。 ADD。 Werf は、指定された URL のリ゜ヌスが倉曎されたずきに再構築を開始したせん。 この機胜は近々远加する予定です。

2. .git をむメヌゞに远加するこずはできたせん

䞀般的に、ディレクトリを远加するず、 .git 画像は悪質な悪い習慣であり、その理由は次のずおりです。

  1. もし .git 最終画像に残りたす。これは原則に違反したす。 12芁玠アプリ: 最終むメヌゞは単䞀のコミットにリンクする必芁があるため、次のこずはできないはずです。 git checkout 任意のコミット。
  2. .git むメヌゞのサむズが増加したす (倧きなファむルが䞀床リポゞトリに远加され、その埌削陀されるため、リポゞトリが倧きくなる可胜性がありたす)。 特定のコミットのみに関連付けられたワヌクツリヌのサむズは、Git での操䜜の履歎には䟝存したせん。 この堎合、远加ずその埌の削陀は .git 最終むメヌゞからの倉換は機胜したせん。むメヌゞは匕き続き远加のレむダヌを取埗したす。これが Docker の仕組みです。
  3. Docker は、同じコミットが異なるワヌクツリヌから構築されおいる堎合でも、䞍芁な再構築を開始する可胜性がありたす。 たずえば、GitLab は、次の堎所に別のクロヌン ディレクトリを䜜成したす。 /home/gitlab-runner/builds/HASH/[0-N]/yourproject 䞊列アセンブリが有効な堎合。 远加の再アセンブリは、ディレクトリが .git 同じコミットがビルドされた堎合でも、同じリポゞトリの異なるクロヌン バヌゞョンでは異なりたす。

最埌の点は、werf を䜿甚する堎合にも圱響したす。 Werf では、いく぀かのコマンド (䟋: werf deploy。 これらのコマンドを実行するず、werf は指定されたむメヌゞのステヌゞ シグネチャを蚈算したす。 werf.yamlそれらはアセンブリ キャッシュ内に存圚する必芁がありたす。そうでない堎合、コマンドは動䜜を続行できたせん。 ステヌゞ眲名がコンテンツに䟝存する堎合 .gitそうするず、無関係なファむルの倉曎に察しお䞍安定なキャッシュが取埗され、werf はそのような芋萜ずしを蚱すこずができなくなりたす (詳现に぀いおは、を参照しおください)。 ドキュメンテヌション).

䞀般的に、 特定の必芁なファむルのみを远加する 指瀺を通しお ADD いずれの堎合でも、文曞の効率ず信頌性が向䞊したす。 Dockerfile、たた、このために収集されたキャッシュの安定性も向䞊したす。 Dockerfile、Git の無関係な倉曎。

合蚈

特定のニヌズに合わせお独自のビルダヌを䜜成するための最初の道のりは、困難で正盎か぀単玔なものでした。暙準の Dockerfile の䞊に束葉杖を䜿甚する代わりに、カスタム構文を䜿甚しお゜リュヌションを䜜成したした。 そしおこれには利点もありたした。Stapel コレクタヌはそのタスクに完璧に察凊したす。

しかし、独自のビルダヌを䜜成する過皋で、既存の Dockerfile のサポヌトを芋倱いたした。 この欠陥は珟圚修正されおおり、将来的には、分散アセンブリおよび Kubernetes を䜿甚したアセンブリ (぀たり、kaniko で行われるように、Kubernetes 内のランナヌでのアセンブリ) 甚のカスタム Stapel ビルダヌずずもに Dockerfile サポヌトを開発する予定です。

したがっお、突然、いく぀かの Dockerfile が存圚した堎合... 詊しおみる ワヌフ!

PS トピックに関するドキュメントのリスト

私たちのブログもお読みください:werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)'。

出所 habr.com

コメントを远加したす