げっとシステムログ

WEB開発メモ

普通のコマンドみたいに docker run を起動する

処理の実体を docker run でコンテナの中に委譲するスクリプトを普通のコマンドみたいな使用感にしたい。

CONTENTS
  1. 出来上がったもの
  2. 通常の呼び出し
  3. 標準入力をパイプラインにする
  4. 標準出力をリダイレクト
  5. 標準エラーをリダイレクト
  6. 端末を割り当てる
  7. まとめ
  8. 参考資料
ENVIRONMENTS
  • Docker version 18.09.7

出来上がったもの

#!/bin/bash

if [ -t 0 ] && [ -t 1 ] && [ -t 2 ]; then
  docker run --rm -it -a stdin -a stdout -a stderr buildpack-deps:disco bash "$@"
else
  docker run --rm -i -a stdin -a stdout -a stderr buildpack-deps:disco bash "$@"
fi

-a で、標準入力、標準出力、標準エラーをコンテナにアタッチする。

  • 標準入力、標準出力、標準エラーが端末なら -itdocker run
  • そうでないなら -idocker run

このスクリプトを docker-bash.sh として保存してあることにして説明していく。

TOP

通常の呼び出し

単にコマンドを発行してみる。

$ ./docker-bash.sh -c 'echo "hello, world!"'
hello, world!

bash -c 'echo "hello, world!"' がコンテナで実行され、その結果が標準出力に出力された。

TOP

標準入力をパイプラインにする

$ cat hello.sh
echo "hello, world!"

$ cat hello.sh | ./docker-bash.sh
hello, world!

標準入力をパイプで繋げて起動すると、bash に入力が渡され、その結果が標準出力に出力された。

TOP

標準出力をリダイレクト

$ ./docker-bash.sh -c 'echo "hello, world!"' > hello.txt
$ cat hello.txt
hello, world!

bash -c 'echo "hello, world!"' がコンテナで実行され、その結果が hello.txt にリダイレクトされた。

TOP

標準エラーをリダイレクト

$ ./docker-bash.sh -c '>&2 echo "hello, error!"; echo "hello, world!"' 2> error.txt
hello, world!

$ cat error.txt
hello, error!

エラーが error.txt にリダイレクトされた。

TOP

端末を割り出てる

$ ./docker-bash.sh
root@bd2f729fddc5:/#

コンテナで bash が起動して端末が割り出てられた。

TOP

まとめ

bash を起動するのはコンテナの中にしつつ、スクリプトとしては通常のコマンドのように動作するスクリプトの書き方をまとめた。

この記事では buildpack-deps:disco イメージで bash を起動しているが、任意のイメージで任意のコマンドを動かせる。

TOP

参考資料

TOP