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

我有一个docker-compose安装程序,它有三个步骤:

  1. 构build所有的容器和dc up -ddcdocker-compose的别名)
  2. 创build数据库: dc run web /usr/local/bin/python create_db.py
  3. 使用以下命令填充数据库: 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