一旦这些容器执行的脚本调用exit(),如何退出“docker run”容器
我有一个docker-compose安装程序,它有三个步骤:
- 构build所有的容器和
dc up -d
(dc
是docker-compose
的别名) - 创build数据库:
dc run web /usr/local/bin/python create_db.py
- 使用以下命令填充数据库:
dc run -d web /usr/local/bin/python -u manage.py populateDB
步骤2和3创build新的容器(请参阅前两个):
~/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
除非他们的工作完成 ,他们不会退出 。
例如,如您所见,创build数据库脚本始终在创build数据库后重新启动。 一旦achromap_web_run_2
完成填充数据库,它将添加每个logging的第二个副本,然后第三个,等等..永远。
在github上,它好像是从docker run --rm
请求的, docker run --rm
标志处理它。 但是--rm
和-d
是不相容的,我不明白。
你知道如何杀死完成执行function的容器吗? 具体来说,如何让dc run web /usr/local/bin/python create_db.py
来退出一次create_db.py调用exit()
? 或者,还有更好的方法?
我想你可能会在这里混淆两件事情。
–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
这将使用你已经运行的容器,执行脚本一次,当脚本退出时,你就完成了。 既然你没有创build一个新的容器(就像run
正在做的那样),那么之后就不会有清理工作。
请注意,您不需要常用于docker exec
的-it
标志。 docker-compose在默认情况下模拟一个tty的exec
。