3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

docker-composeのcommandで、複数コマンドを実行する方法

Last updated at Posted at 2024-06-03

はじめに

 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コマンドを順番に実行します。それぞれのコマンドは新しい行に配置されます。このように、| はシェルスクリプトや複数行のコマンドを記述するのに便利です。一方、> は長い文章やメッセージを記述するのに便利です。それぞれの記号が適している状況を理解することが重要です。それぞれの用途に応じて適切な記号を選択してください。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?