LoginSignup
8
5

More than 5 years have passed since last update.

Dockerコンテナを--rmフラグをつけてdetach実行するには

Last updated at Posted at 2016-04-13

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を捨てている、というわけです。考え方は通常のプロセス実行のときと同じですね。

8
5
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
8
5