docker run
のdetachedモード-d
, --detach
と自動削除オプション--rm
は排他的です。
$ docker run -d --rm -p 10080:80 nginx
Conflicting options: --rm and -d
あとで参照することのないコンテナは自動で削除してしまいたいのですが--detach
を指定するとそれができません。detachedモードではコンテナIDが返ってくるのでそれを頼りにdocker rm
すればいいのですが忘れることもありますよね。そうして、これなんだっけ、なコンテナIDがじわじわと溜まっていく。。
避けたいときは自分は次のようにしています。
$ docker run --rm -p 10080:80 --name detach_test nginx > /dev/null 2>&1 &
[1] 37254
よく見るプロセスのバックグラウンド実行ですよね。こうすることでdetachedモードと同等の結果が得られるはずです。
もちろんコンテナを停止すると次の通り自動的に削除してくれます。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f58b460cbba nginx "nginx -g 'daemon off" 35 seconds ago Up 34 seconds 443/tcp, 0.0.0.0:10080->80/tcp detach_test
$ docker stop detach_test
detach_test
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[1]+ Done docker run --rm -p 10080:80 --name detach_test nginx > /dev/null 2>&1
ヘルプにもあるようにコンテナIDを出力しないので不便に思うかもしれません。
$ docker run --help | grep "\-d,"
-d, --detach Run container in background and print container ID
それでしたらファイルに書き出すことになりますが--cidfile=
なんていかがでしょうか。
docker run --help | grep "--cidfile"
--cidfile Write the container ID to the file
標準出力を /dev/null に捨てているので不安だったりしますか? 大丈夫です。
$ curl http://localhost:10080/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
$ docker logs detach_test
172.17.42.1 - - [12/Apr/2016:11:22:36 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
コンテナが停止するまではdocker logs
で参照できます。必要ならばdocker attach
してもいいです。
コンテナはdetachedモードではSTDOUTとSTDERRが無効になりますが、
$ docker run -d --name detached_container nginx
$ docker inspect detached_container | grep AttachStd
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
フォアグラウンドで実行したときはSTDOUTとSTDERRが有効になります。
$ docker run --rm --name foreground_container nginx
$ docker inspect foreground_container | grep AttachStd
"AttachStdin": false,
"AttachStdout": true,
"AttachStderr": true,
ですから&
でバックグラウンド実行するとともに> /dev/null 2>&1
でSTDOUTとSTDERRを捨てている、というわけです。考え方は通常のプロセス実行のときと同じですね。