“如何退出”;docker run“;一旦脚本启动,这些容器就会执行exit()调用
我有一个docker compose设置,分三步部署:“如何退出”;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脚本总
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
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