Docker構成を持つコードのゼロ行で高速なローカルサービスの開始
14576 ワード
...YAMLがコードとしてカウントされない限り.
多くの企業は、家庭で成長したスクリプトとツールをローカルでサービスを開始する必要があります.私の経験では、スクリプトはよく共通の簡素化ラッパーとしてスタート
内部ツールを使用するために
YAML's merge syntax サービス間の共通の設定の共有 すべてのサービスと依存関係を一度に表示する(または複数の場合、使用する場合に応じて) 構成変更をすばやく繰り返す メンテナンス要件のないロバスト,コミュニティサポートCLIに依存 代わりにサポートを追加すること エクスポート 例を通して歩く
次に、
多くのサービスはHealthcheckを共有するかもしれません、その場合、複製を減らすためにYAMLマージキータイプにそれを引っ張ります 新規または一対一サービスについてはlooking here 存在するか、インスピレーションのために見るか.一度、あなたが考えているコマンドがあります. あなたがイメージに気づくでしょう
以下はその例です.
一日一日、あなたが使用されます
そして、それ!すべてのサービスを最小限の重複で1つのファイルでは、コミュニティの最新の機能を使用して実行することができますを実行することができますがサポートされていないコードを維持するコードをサポート!
多くの企業は、家庭で成長したスクリプトとツールをローカルでサービスを開始する必要があります.私の経験では、スクリプトはよく共通の簡素化ラッパーとしてスタート
docker
and docker-compose
コマンド.しかしながら、彼らは年齢が悪い傾向があります.彼らは複雑になって、保守的な負担です、そして、彼らがすでによく知られているかもしれない基礎となるツール命令の代わりにラッパーコマンドを学ぶデベロッパーを強制してください.彼らはそれぞれのフラグやオプションをラップしていない、彼らは柔軟性が少ない.彼らは更新プログラムをラップするときは、ツールは、新しい機能を活用するために変更する必要があります.これは順番に、推奨されない、遅い、またはより安全なコマンドを使用して、顧客に価値を提供するエンジニアリングチームの能力に影響を与えます.内部ツールを使用するために
docker-compose
直接.このアプローチを使用すると、YAML's merge syntax サービス間の共通の設定の共有
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
condition
とhealthcheck
一緒にキーを使用すると、彼らが互いに依存していない場合は、並列にサービスを開始することができますし、彼らがいる場合は順序で.あなたが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を追加するには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つのファイルでは、コミュニティの最新の機能を使用して実行することができますを実行することができますがサポートされていないコードを維持するコードをサポート!
Reference
この問題について(Docker構成を持つコードのゼロ行で高速なローカルサービスの開始), 我々は、より多くの情報をここで見つけました https://dev.to/therockstorm/start-local-services-fast-in-zero-lines-of-code-with-docker-compose-jh8テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol