Docker-compose exec で出たPythonエラー対応メモ。

Jenkinsやらgitのhookやらで利用した時にPythonのエラーが出たのを対応したメモ。


環境

  • OS
    • ProductName: Mac OS X
    • ProductVersion: 10.11.6
    • BuildVersion: 15G1004
  • Docker
    • 1.12.1
  • docker-compose
    • 1.8.0

docker-compose exec でエラーが発生する

Jenkinsやらgitのhookで docker-compose exec を利用するとエラーが発生する。
例えばJenkisnの場合を例として app コンテナで script.sh というシェルスクリプトを実行してみる。

単純なスクリプト。

script.sh
1
2
3
#!/bin/bash -eu

echo "hoge"

Jenkinsには以下を設定。

Jenkins
1
2
3
4
5
6
node {
stage 'Run Script'
dir("${APP_DIR}") {
sh '/usr/local/bin/docker-compose exec app /app/script.sh'
}
}

実行後、以下のエラーが発生する。

Terminal
1
2
3
4
5
6
7
8
9
10
11
[Server] Running shell script
+ /usr/local/bin/docker-compose exec app /app/script.sh
Traceback (most recent call last):
File "<string>", line 3, in <module>
File "compose/cli/main.py", line 61, in main
File "compose/cli/main.py", line 113, in perform_command
File "compose/cli/main.py", line 441, in exec_command
File "site-packages/dockerpty/pty.py", line 338, in start
File "site-packages/dockerpty/io.py", line 32, in set_blocking
ValueError: file descriptor cannot be a negative integer (-1)
docker-compose returned -1

TTYが悪さをしているらしい

調べると原因はわからないが、ttyを無効にすると止まらなくなったよというような内容を見つけた。

ttyとは、標準入出力となっている端末デバイス(制御端末、controlling terminal)の名前を表示するUnix系のコマンドである。元来ttyとはteletypewriter(テレタイプライター)のことを指す。

docker-compose exec -h でヘルプを見ると以下のオプションがあった。

-T Disable pseudo-tty allocation. By default docker-compose exec
allocates a TTY.

これをつけて実行するとttyが無効になるらしいので、つけてみる。

Jenkins
1
2
3
4
5
6
node {
stage 'Run Script'
dir("${APP_DIR}") {
sh '/usr/local/bin/docker-compose exec -T app /app/script.sh'
}
}

実行後の結果。

Terminal
1
2
3
[Server] Running shell script
+ /usr/local/bin/docker-compose exec -T app /app/script.sh
hoge

-T をつけることで問題なく動くようになった。

以上です。

© 2024 磁力式駆動 All Rights Reserved.
Theme by hiero