我有一个docker-compose设置,它分三步部署:
dc up -d
(dc
是docker-compose
的别名)dc run web /usr/local/bin/python create_db.py
dc run -d web /usr/local/bin/python -u manage.py populateDB
步骤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()
退出?或者有更好的方法吗?
答案 0 :(得分:1)
我想你可能会在这里混淆两件事。
这样做是为了在容器完成后进行清理,因此它不会在死容器池中闲逛。如您所见,它与-d
不兼容。但在这种情况下,你无论如何也不需要它。
(也可以在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。