“如何退出”;docker run“;一旦脚本启动,这些容器就会执行exit()调用

“如何退出”;docker run“;一旦脚本启动,这些容器就会执行exit()调用,docker,docker-compose,Docker,Docker Compose,我有一个docker compose设置,分三步部署: 构建所有容器并dc up-d(dc是docker compose的别名) 创建数据库时使用:dc-run-web/usr/local/bin/python-Create\u-db.py 使用以下内容填充数据库:dc run-d web/usr/local/bin/python-u manage.py populateDB 步骤2和3创建新容器(请参见前两步): 这一切都很好,只是他们在工作完成后不退出 例如,可以看到,createdb脚本总

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

  • 构建所有容器并
    dc up-d
    dc
    docker compose
    的别名)
  • 创建数据库时使用:
    dc-run-web/usr/local/bin/python-Create\u-db.py
  • 使用以下内容填充数据库:
    dc run-d web/usr/local/bin/python-u manage.py populateDB
  • 步骤2和3创建新容器(请参见前两步):

    这一切都很好,只是他们在工作完成后不退出

    例如,可以看到,createdb脚本总是在创建数据库后重新启动。一旦
    achromap\u web\u run\u 2
    完成填充数据库,它将添加每个记录的第二个副本,然后添加第三个副本,以此类推。。永远

    在github上,这似乎是docker要求的,而
    docker run--rm
    标志处理它。但是
    --rm
    -d
    是不兼容的,我不理解


    您知道如何杀死已完成其功能的容器吗?具体来说,如何让
    dc运行web/usr/local/bin/python create_db.py
    退出create_db.py调用
    exit()
    ?还是有更好的办法?

    我想你可能把两件事混为一谈了

    --rm标志 它的存在是为了在容器完成后进行清理,所以它不会挂在死容器池中。正如您已经发现的,它与
    -d
    不兼容。但在这种情况下,你无论如何都不需要它

    --restart标志 (也可在docker compose中作为
    重新启动
    属性使用。)

    此标志设置重新启动策略。默认情况下,它设置为
    ,但您可以将其设置为其他一些值,包括
    始终
    。我怀疑您当前已将其设置为
    始终
    ,这将迫使容器在每次自行停止时重新启动

    如果手动停止容器(
    docker stop…
    ),则自动重新启动将不会启动。但如果进程自行退出或崩溃,则容器将重新启动。这是因为显而易见的原因,所以如果服务崩溃,您的服务将再次启动

    如何进行 我想说的是,对于这些任务,您需要使用
    exec
    而不是
    run

    首先,正常运行容器(即,
    docker compose-d

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

    docker-compose exec web /usr/local/bin/python create_db.py
    
    这将使用已经运行的容器,执行一次脚本,当脚本退出时,就完成了。由于您没有创建新容器(如
    run
    was所做的),因此之后就没有要进行的清理


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

    是否有方法监视docker exec任务的进度?我现在正在做
    docker exec web-d web/usr/local/bin/python-u manage.py populated b
    ,但是我无法监视数据库填充的进度,因为我找不到我在populated b函数中放入的日志语句。@AlexLenail如果你删除
    -d
    ,你可以只看stdout。。。你需要因为特定的原因将其分离吗?
    populateDB
    大约需要一天时间,我不想让我的机器一直打开并运行。我可以选择
    dm ssh
    ,然后选择
    nohup docker exec
    ,这可能会产生相同的结果。我的
    web
    容器具有
    重启:始终
    ,这对web容器有意义,但对运行web任务的容器没有意义。我需要仔细考虑一下,特别是
    docker compose run
    docker run
    之间的区别。
    docker-compose exec web /usr/local/bin/python create_db.py