git hookでdocker動かすとThe input devise is not a TTYエラー

Docker

だんだん脳が老化してきたのかschemaの更新忘れが増えてきたので、git hookを仕込みpre-push時に強制的にmigrationを行うようにしてみました。

しかし、なぜか

The input devise is not a TTY

が出てうまく動かない。

原因

原因を調べてみると、docker containerの標準入出力とのtty接続がおかしなことになってたっぽいです。

まず自分のdocker環境ではdocker-compose.ymlにて


stdin_open: true
tty: true

のようなオプションがデフォルトで有効になるようにしています。

そのためgit hookのscriptで


#!/bin/sh

rm -f db/schema.rb
docker-compose exec app bin/rails db:environment:set RAILS_ENV=development
docker-compose exec app bin/rails db:reset
docker-compose exec app bin/rails db:migrate

のようにするとcontainerの標準入出力が接続するデバイスがわからなくなり(?)、The input devise is not a TTYエラーを起こしていたようです。
(普通にホストマシンのターミナルのシェルからこれらのコマンドを叩いたらうまくいくので、scriptを動かす時のシェルは全く別のデバイスとして認識されているのか?)

解決策

解決策は単純で、ttyを無効にするようなオプション(-T)をつけてこれらのコマンドを叩くようにすればいいだけです。


#!/bin/sh

rm -f db/schema.rb
docker-compose exec -T app bin/rails db:environment:set RAILS_ENV=development
docker-compose exec -T app bin/rails db:reset
docker-compose exec -T app bin/rails db:migrate

dockerって難しいですね。

コメント

タイトルとURLをコピーしました