Docker構成を持つコードのゼロ行で高速なローカルサービスの開始


...YAMLがコードとしてカウントされない限り.
多くの企業は、家庭で成長したスクリプトとツールをローカルでサービスを開始する必要があります.私の経験では、スクリプトはよく共通の簡素化ラッパーとしてスタートdocker and docker-compose コマンド.しかしながら、彼らは年齢が悪い傾向があります.彼らは複雑になって、保守的な負担です、そして、彼らがすでによく知られているかもしれない基礎となるツール命令の代わりにラッパーコマンドを学ぶデベロッパーを強制してください.彼らはそれぞれのフラグやオプションをラップしていない、彼らは柔軟性が少ない.彼らは更新プログラムをラップするときは、ツールは、新しい機能を活用するために変更する必要があります.これは順番に、推奨されない、遅い、またはより安全なコマンドを使用して、顧客に価値を提供するエンジニアリングチームの能力に影響を与えます.
内部ツールを使用するためにdocker-compose 直接.このアプローチを使用すると、

  • YAML's merge syntax サービス間の共通の設定の共有
  • すべてのサービスと依存関係を一度に表示する(または複数の場合、使用する場合に応じて)
  • 構成変更をすばやく繰り返す
  • メンテナンス要件のないロバスト,コミュニティサポートCLIに依存
  • 代わりにサポートを追加すること
  • エクスポートCOMPOSE_FILE 変数は、任意のディレクトリからサービスを開始することができます.
  • 例を通して歩くdocker-compose.yml このアプローチを使用するファイル.
    version: "2.4"
    
    x-depends-on-postgres: &depends-on-postgres
      postgres: { condition: service_healthy }
    
    x-interval5-retries45-timeout5
      interval: 5s
      retries: 45
      timeout: 5s
    
    まず、V 2を使用してください.v 3の代わりに4つの構文.Xを考えるdocker-compose V 2とV 3はより完全なフォークをサポートしています.理想的には、サービスが依存している依存性に対して弾力性があります.そうでなければ、docker-compose V 24構文を使用することができますdepends_on conditionhealthcheck 一緒にキーを使用すると、彼らが互いに依存していない場合は、並列にサービスを開始することができますし、彼らがいる場合は順序で.あなたがv 3を使っているならば.Xthis page 同様のオプションを達成するためのオプションを与え、彼らはちょうどより多くの仕事をしている、悲しいことに、計画は、V 2の機能を追加することです.
    次に、x- 経由YAML merge key types , どちら docker-compose supports . この例では2つのサービスしか持っていないので、あまり共有されませんが、これはより現実的なシナリオの複製を大幅に減らすことができます.
    services:
      my-service:
        depends_on:
          <<: *depends-on-postgres
        environment:
          SERVICE_NAME: my-service
        image: ${MY_SERVICE_REPO:-MY_DEFAULT_REGISTRY}/my-service:latest
    
      postgres:
        environment:
          PGDATA: /var/lib/postgresql/data/pgdata
          POSTGRES_DATABASE: my-service-data
          POSTGRES_PASSWORD: xxx
          POSTGRES_USER: user
        healthcheck:
          test:
            "res=$$(echo 'SELECT 1' | psql --host localhost --username $$POSTGRES_USER
            --dbname $$POSTGRES_DATABASE --quiet --no-align --tuples-only) &&
            [$$res = '1' ] && exit 0 || exit 1"
          <<: *interval5-retries45-timeout5
        image: postgres:12
        ports: [5432:5432]
        volumes:
          - ./data/postgres:/var/lib/postgresql/data/pgdata:delegated
        command: postgres
    
    services セクションでは、通常どおりに追加します.次に、depends_on 依存関係とサービスのキーhealthcheck サービスのキーは別のサービスによって異なります.HealthCheckを追加するには
  • 多くのサービスはHealthcheckを共有するかもしれません、その場合、複製を減らすためにYAMLマージキータイプにそれを引っ張ります
  • 新規または一対一サービスについてはlooking here 存在するか、インスピレーションのために見るか.一度、あなたが考えているコマンドがあります.exec コンテナにdocker-compose exec SERVICE sh テストしてください.コンテナがないcurl または他のツールので、創造的に取得する必要があります.それが動作したら、コマンドをdocker-compose.yml , サービスを開始し、実行するdocker-compose ps それを確実にすることは、健康になります.そうしないと走るdocker inspect $(docker-compose ps -q SERVICE) | jq '.[].State.Health' 何が返されているかを確認するには、コマンドを編集し、もう一度試してください.
  • あなたがイメージに気づくでしょうmy-service 'sイメージは${MY_SERVICE_REPO:-MY_DEFAULT_REGISTRY}/my-service:latest . これにより、ローカルとホストのイメージをすばやくスワップできますusing a .env file . デフォルトではMY_DEFAULT_REGISTRY . ローカルイメージを使用するにはMY_SERVICE_REPO=local to .env .
    services:
      # ...as shown above
    
      flow-backend:
        depends_on:
          my-service: { condition: service_healthy }
          # ...other services
        image: rwgrim/docker-noop
    
    あなたが一緒に開始する傾向があるサービスがあるでしょう.これを容易にするために、必要に応じてservices . これらは、彼らの扶養家族を始めるために存在します rwgrim/docker-noop イメージは、単に正常に終了します.実際のアプリケーションでは、多分あなたがあるでしょうflow-backend , flow-frontend , それからflow-all それは前の流れの両方に依存します.
    以下はその例です.
    version: "2.4" # v3 doesn't support using depends_on conditions with healthcheck
    
    #############################################################################
    # Shared config via merge key types, https://yaml.org/type/merge.html
    #############################################################################
    x-depends-on-postgres: &depends-on-postgres
      postgres: { condition: service_healthy }
    
    x-interval5-retries45-timeout5
      interval: 5s
      retries: 45
      timeout: 5s
    
    services:
      #############################################################################
      # Services
      #############################################################################
      my-service:
        depends_on:
          <<: *depends-on-postgres
        environment:
          SERVICE_NAME: my-service
        image: ${MY_SERVICE_REPO:-MY_DEFAULT_REGISTRY}/my-service:latest
    
      postgres:
        environment:
          PGDATA: /var/lib/postgresql/data/pgdata
          POSTGRES_DATABASE: my-service-data
          POSTGRES_PASSWORD: xxx
          POSTGRES_USER: user
        healthcheck:
          test:
            "res=$$(echo 'SELECT 1' | psql --host localhost --username $$POSTGRES_USER
            --dbname $$POSTGRES_DATABASE --quiet --no-align --tuples-only) &&
            [$$res = '1' ] && exit 0 || exit 1"
          <<: *interval5-retries45-timeout5
        image: postgres:12
        ports: [5432:5432]
        volumes:
          - ./data/postgres:/var/lib/postgresql/data/pgdata:delegated
        command: postgres
    
      #############################################################################
      # Flows
      #############################################################################
      flow-backend:
        depends_on:
          my-service: { condition: service_healthy }
          # ...other services
        image: rwgrim/docker-noop
    
    さらに高い生産性、輸出COMPOSE_FILE='path/to/docker-compose.yml' とエイリアスを作成するalias dcp=docker-compose , 任意のディレクトリからサービスを開始することができます!
    一日一日、あなたが使用されますdocker-compose 直接コマンド.共通コマンドdcp up -d SERVICE_1 SERVICE_2 ... 提供するサービスとその依存関係を作成して開始するには-d or --detach フラグはバックグラウンドで実行される).dcp ps ステータスを一覧表示するにはdcp stop 止める.dcp start それらをバックアップし、そしてdcp down コンテナ、画像、およびボリュームを削除します.ランdcp pull 最新画像をダウンロードするにはdcp logs SERVICE_1 SERVICE_2 ログを表示するにはdcp config --services 検証するdocker-compose.yml 定義されたすべてのサービスをファイルとリストdcp config --services | grep flow を返します.ランdcp -h を返します.
    そして、それ!すべてのサービスを最小限の重複で1つのファイルでは、コミュニティの最新の機能を使用して実行することができますを実行することができますがサポートされていないコードを維持するコードをサポート!