2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Docker Composeコマンドなどのショートカット(direnv方式)

Last updated at Posted at 2022-07-18

目的

主にローカルデバッグのためにdocker compose up -ddocker compose downぐらいを実行するのはさておき、

docker compose exec rails-app bin/rails db:migrate
docker compose exec database psql -U database

など実行系のサブコマンドに続いてコンテナ内のコマンドを実行すると、入力するコマンドが長くなる、コマンドを間違えたり忘れたり覚えにいなど、めんどくさいので簡略化のためにショートカットを用いたいことがある1

解決方法例

  • プロジェクトのbin/配下にスクリプトを置く。
  • aliasで短い名称を付与する(.bash_profile等に記述)。
  • makeでコマンドを実行する(Makefileに記述)。

これらの方法としてQiitaの記事では、

などがあり、それぞれメリット・デメリットがあると思う。
例えば、aliasは基本的に個人的なものになりプロジェクトでは共有しにくいし、makeは本来はビルドに関するツールなので生成に関するものだけを記述したい2

GNU Make is a tool which controls the generation of executables and other non-source files of a program from the program's source files.

direnv による解決方法

こちらを使って、プロジェクトで共通に利用できるものとし、コマンドとして意味がわかりやすいものとして利用できる様にしてみる。

デメリットとしては、

  • まず、direnvをインストールしなくてはいけない(逆にプロジェクト内で利用したい人だけインストールすれば良い1)。
  • direnvは本来はその名の通り、そのディレクトリーで環境変数を割り当ててくれるツールなのでalias,functionsを利用するのは想定外3の方法になる。
  • そもそも、クレデンシャル情報などを登録することが多いので、.gitignore.envrcを記載せよとの情報が多いのでプロジェクトの方針として管理外にする運用かもしれない。

上記の点が許容できるなら、direnv利用の元、.envrcに次のスクリプトを記述する。

# Picking up aliases and functions
#   - https://github.com/direnv/direnv/issues/73
export_function() {
  local name=$1
  local alias_dir=$PWD/.direnv/aliases
  mkdir -p "$alias_dir"
  PATH_add "$alias_dir"
  local target="$alias_dir/$name"
  if declare -f "$name" >/dev/null; then
    echo "#!/usr/bin/env bash" > "$target"
    declare -f "$name" >> "$target" 2>/dev/null
    echo "$name \$@" >> "$target"
    chmod +x "$target"
  fi
}

myproject() {
  case $1 in
  up)
    docker compose up -d ;;
  restart)
    docker compose stop
    docker compose up -d ;;
  down)
    docker compose down ;;
  migrate)
    docker compose exec rails-app bin/rails db:migrate ;;
  foo)
    docker compose exec foo-service foo-command ;;
  *)
    echo "Usage:"
    echo "  ${FUNCNAME[0]} <sub command>" ;;
  esac
}
export_function myproject

これにて、

$ myproject up        # docker compose up
$ myproject migrate   # docker compose exec rails-app bin/rails db:migrate
$ myproject down      # docker compose down

こんな感じでショートカットコマンドが実現できる。そのプロジェクト(myproject)を起動、再起動、終了、○○を実行するという、意味がわかりやすく、覚えやすい、ショートカットとして利用できる。

実際のプロジェクトへの適用ではmyproject部分をプロジェクト名なり開発コードなりに置き換えて、case文の中にそれぞれの言語やフレームワークやツールのコマンド軍を記述し;;で終了させる。

direnvの環境変数を適用したい場合

次の行を.envrcに追加し

if [ -e ".envrc.local" ]; then source .envrc.local; fi

.envrc.local

export FOO_PASSWORD=p@ssw0rd

などし、.gitignoreには.envrc.localだけ登録すれば良い。

  1. 自分はhistory+!番号で行っていました。 2

  2. 例えばC/C++などのプロジェクトでは大抵Makefile生成のためのルールを記述するが、ここにデバッグ用のdockerの実行コマンドを混ぜたくない。あくまでも個人的には。

  3. Picking up aliases and functions #73 - https://github.com/direnv/direnv

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?