如何退出" docker run"容器一旦这些容器执行调用exit()

时间:2017-01-15 01:43:16

标签: docker docker-compose

我有一个docker-compose设置,它分三步部署:

  1. 构建所有容器并dc up -ddcdocker-compose的别名)
  2. 使用以下内容创建数据库:dc run web /usr/local/bin/python create_db.py
  3. 使用以下代码填充数据库:dc run -d web /usr/local/bin/python -u manage.py populateDB
  4. 步骤2和3创建新容器(参见前两个):

    ~/Documents/Project » docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                              PORTS                    NAMES
    2ead532ea58b        myproject_web       "/usr/local/bin/pytho"   8 minutes ago       Up 8 minutes                        8000/tcp                 myproject_web_run_2
    64e1f81ecd1a        myproject_web       "/usr/local/bin/pytho"   9 minutes ago       Restarting (0) About a minute ago   8000/tcp                 myproject_web_run_1
    9f5c670d4d7f        myproject_nginx     "/usr/sbin/nginx"        40 minutes ago      Up 40 minutes                       0.0.0.0:80->80/tcp       myproject_nginx_1
    46d3e8c09c03        myproject_web       "/usr/local/bin/gunic"   40 minutes ago      Up 40 minutes                       8000/tcp                 myproject_web_1
    ea876e68c8c6        postgres:latest     "/docker-entrypoint.s"   40 minutes ago      Up 40 minutes                       0.0.0.0:5432->5432/tcp   myproject_postgres_1
    

    哪一项都很好,除非 在工作完成后不退出

    例如,正如您所见,create db脚本在创建数据库后始终会重新启动。一旦achromap_web_run_2完成填充数据库,它将添加每个记录的第二个副本,然后是第三个,等等。永远。

    在github上,似乎这是从docker请求的,docker run --rm标志处理它。但--rm-d不相容,我不明白。

    你知道如何杀死已经完成其功能的容器吗?具体来说,一旦create_db.py调用dc run web /usr/local/bin/python create_db.py,如何让exit()退出?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我想你可能会在这里混淆两件事。

--rm标志

这样做是为了在容器完成后进行清理,因此它不会在死容器池中闲逛。如您所见,它与-d不兼容。但在这种情况下,你无论如何也不需要它。

--restart标志

(也可以在docker-compose中作为restart属性使用。)

此标志设置重启策略。默认情况下,它设置为no,但您可以将其设置为其他一些值,包括always。我怀疑你当前将它设置为always,这会强制容器每次停止时重新启动。

如果手动停止容器(docker stop ...),则无法启动自动重启。但是如果进程自行退出或崩溃,那么容器将重新启动。这是显而易见的原因,因此如果崩溃,您的服务将重新启动。

如何进行

我想说的是,您需要使用exec代替run来执行这些任务。

首先,正常运行您的容器(即docker-compose up -d)。

不使用run执行create_db.py,而是使用exec

docker-compose exec web /usr/local/bin/python create_db.py

这将使用您已经运行的容器,执行一次脚本,当脚本退出时,您已完成。由于您没有创建新容器(如run正在做的那样),因此之后无法进行清理。

请注意,您不需要-it经常与docker exec一起使用的exec标记。 docker-compose默认情况下模拟O(n)上的tty。