はじめに
docker-compose.ymlのcommandで、複数のbashコマンドを記述する方法を紹介する。gitlab-ci.ymlなどにも応用可能。
動作確認環境
- Ubuntu 20.04
方法
commandキーの後ろに、bash -c と|
を併用する。
command:
- /bin/bash
- -c
- |
echo "Command 1"
echo "Command 2"
YAMLの|
は、改行がそのまま解釈される。よって、上記は上から順番の処理されてい以下のような結果になる。
Command 1
Command 2
注意: >
との|
の違い
>
でも、複数コマンドを実現できるが、>
では、改行=空白扱いとなるため、&&
で連結する必要があり不向き。下記のようなwhile文はエラーとなる。
command: >
/bin/bash -c "echo 'Command 1' &&
while true; do echo 'Command 2'; sleep 1s; done"
エラー内容
for: -c: 行 1: 構文エラー: 予期しないファイル終了 (EOF) です
|
なら実行可能。
command:
- /bin/bash
- -c
- |
echo 'Command 1'
while true; do echo 'Command 2'; sleep 1s; done
まとめ
docker-composeのcommandで、複数コマンドを実行する方法を紹介した。bash -c と|
を使うことで、可読性を上げて複数行コマンドを記述することができた。
参考
おまけ:Microsoft Copilotに聞いた解説 (>
と|
の違い)
非常にわかりやすい解説でした。
質問
YAMLの複数コマンドの記述について教えてください。
> と | の違いは何ですか?
回答
YAMLでは、複数行の文字列を記述するために > と | という2つの記号が使われます。これらの記号は、それぞれ異なる方法で改行を扱います。
>: この記号は “フォールド” を意味します。複数行の文字列を1行に折りたたむ(つまり、改行をスペースに置き換える)ために使用されます。例えば、以下のように使用します:
key: >
これは
複数行の
文字列です
上記のYAMLは次のように解釈されます:"これは 複数行の 文字列です"
|: この記号は “リテラル” を意味します。複数行の文字列をそのまま保持し、改行も保持します。例えば、以下のように使用します:
key: |
これは
複数行の
文字列です
上記のYAMLは次のように解釈されます:
"これは\n複数行の\n文字列です\n"
したがって、YAMLで複数のコマンドを記述する場合、それぞれのコマンドが新しい行に来るように | を使用することが一般的です。例えば:
commands: |
echo "Command 1"
echo "Command 2"
上記のYAMLは、2つのechoコマンドを順番に実行します。それぞれのコマンドは新しい行に配置されます。このように、| はシェルスクリプトや複数行のコマンドを記述するのに便利です。一方、> は長い文章やメッセージを記述するのに便利です。それぞれの記号が適している状況を理解することが重要です。それぞれの用途に応じて適切な記号を選択してください。