カテゴリー
docker-composeのprofilesタグを設定して特定のサービスだけを選択的に実行する
※ 当ページには【広告/PR】を含む場合があります。
2023/02/19
目次
1. Docker-composeでのprofilesタグの使い方
2. runサブコマンドの--service-potsオプションによるポート有効化
3. runサブコマンドで立ち上げたコンテナを止めるときのSIGINTエラー対策
4. Docker-composeのcommandで使うシェル形式とexec形式の違い
Docker-compseのプロファイル機能の使い方
profiles登場以前のサービス切り分け
-f
$ docker-compose -f A.yml run app hoge
$ docker-compose -f B.yml run server piyo
$ docker-compose -f A.yml -f B.yml -f C.yml run fuga
docker-compose.development.bootstrap.yml
-f A.yml -f B.yml -f C.yml ...
profilesタグを使ってサービスを細かく切り替える
version: "3.9"
services:
hoge:
image: hoge-image
piyo:
image: piyo-image
fuga:
image: hoge-image
command: echo hoge
depends_on:
- piyo
hoge
piyo
fuga
docker-compose run fuga
version: "3.9"
services:
hoge:
image: hoge-image
ports:
- "3000:3000"
tty: true
piyo:
image: piyo-image
ports:
- "3001:3001"
fuga:
image: hoge-image
command: echo hoge
ports:
- "3002:3002"
depends_on:
- piyo
profiles:
- fuga-only
#profiles: ["fuga-only"] でもOK
$ docker-compose --profile fuga-only run fuga
#👇もしくはプロファイルとサービスの一意に決まる場合、--profile省略可
$ docker-compose run fuga
#👇これはhogeとpiyoのみ起動
$ docker-compose up -d
docker-compose runでportsを使うときは--service-portsオプションを忘れずに
docker-compose run
$ docker-compose run fuga http-server
Server is now starting on http://localhost:3002 ...
http://localhost:3002
$ docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
755ce5d439ca node:alpine3.17 "http-server" fuga_run_a48da6a76102
#...
$ docker-compose run --service-ports fuga http-server
Server is now starting on http://localhost:3002 ...
$ docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
cdd707747dd5 node:alpine3.17 "http-server" 0.0.0.0:3002->3002/tcp, :::3002->3002/tcp, fuga_run_a48da6a76102
#...
よもやま話〜docker-compose.ymlのversionの意味
docker-compose.yml
3.9
3.9
version: "3"
3.*
^3.0
3 = 3.0
version: "3"
コンテナの終了時に出てしまうSIGINTエラーに対応する
docker-compose run
SIGINTエラー
version: '3.9'
services:
app: &app
image: node:alpine3.17
container_name: node-dev
user: "node:node"
environment:
NODE_ENV: development
volumes:
- ./:/usr/src/app
working_dir: "/usr/src/app"
ports:
- "3000:3000"
tty: true
cmd:
<<: *app
container_name: build-and-serve
command: >
bash -c '
cd myapp &&
yarn build &&
echo "Server is getting Started!" &&
yarn serve
'
stop_signal: SIGINT
profiles:
- mytool
cmd
$ docker-compose run --service-ports cmd
#...ビルドとサーバー起動が行われる
error Command failed with signal "SIGINT".
docker-composeのcommandとendpointの使い分け
CMD
1. exec形式(推奨):
CMD ["実行バイナリ", "パラメータ1", "パラメータ2", "パラメータ3", ...]
2. シェル形式:
CMD <コマンド>
3. ENDPOINTのパラメータ形式:
CMD ["パラメータ1", "パラメータ2"]
(※ENTRYPOINTでコマンド指定が必要)
ENTRYPOINT
1. exec形式(推奨):
ENTRYPOINT ["実行可能なコマンド", "パラメータ1", "パラメータ2", "パラメータ3", ...]
2. シェル形式:
ENTRYPOINT コマンド パラメータ1 パラメータ2 ...
bash -c
#...
command: >
bash -c '
cd myapp &&
yarn build &&
echo "Server is getting Started!" &&
yarn serve
'
#...
bash -c 'hoge.sh'
シェバンを正しく指定してシェルのプロセスを生存させる
Ctrlキー+Cキー
error Command failed with signal "SIGINT".
「SIGINT」
ps a
$ ps a
PID TTY STAT TIME COMMAND
13724 pts/1 Sl+ 0:00 docker-compose run --rm --service-ports cmd
13851 pts/0 Ssl+ 0:00 node /usr/share/node_modules/yarn/bin/yarn.js serve
14052 pts/0 Sl+ 0:01 /usr/bin/node /usr/src/app/******/node_modules/.bin/vite pr
14063 pts/0 Sl+ 0:00 /usr/src/app/******/node_modules/@esbuild/linux-x64/bin/esb
bash
SIGINT
bash -c
#...
command: >
bash -c '
cd myapp &&
yarn build &&
echo "Server is getting Started!" &&
yarn serve
'
#...
#!/bin/bash
cd myapp
yarn build
echo "Server is getting Started!"
yarn serve
$ chmod +x run.sh
#...
command: bash -c './run.sh'
#👇シェル形式・exec形式どっちでもOK
command: ['./run.sh']
$ ps a
PID TTY STAT TIME COMMAND
12710 pts/1 Sl+ 0:00 docker-compose run --rm --service-ports cmd
(☆)12835 pts/0 Ss+ 0:00 /bin/bash ./run.sh
13011 pts/0 Sl+ 0:00 node /usr/share/node_modules/yarn/bin/yarn.js serve
13032 pts/0 Sl+ 0:01 /usr/bin/node /usr/src/app/******/node_modules/.bin/vite pr
13048 pts/0 Sl+ 0:00 /usr/src/app/******/node_modules/@esbuild/linux-x64/bin/esb
bash run.sh
bash -c
まとめ
1. Docker-composeでのprofilesタグの使い方
2. runサブコマンドの--service-potsオプションによるポート有効化
3. runサブコマンドで立ち上げたコンテナを止めるときのSIGINTエラー対策
4. Docker-composeのcommandで使うシェル形式とexec形式の違い
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー