决定何时使用“docker运行”与“docker启动”并使用给定图像的最新版本的策略

我正在docker化我们的一些服务。 对于我们的开发环境,我希望为开发人员尽可能地简单,因此我正在编写一些脚本来pipe理dockerized组件。 我希望开发人员能够启动和停止这些服务,就像他们没有被docker化。 我不希望他们不必担心创build和运行容器vs停止和启动和已经创build的容器。 我想这可以使用图来处理。要创build容器(如果它不存在)并启动服务,我会使用fig –no-recreate 。 要停止服务,我会使用无花果停止

我还想确保开发人员正在运行使用最新映像构build的容器。 换句话说,有些东西会检查我们的Dockerregistry中是否有更高版本的图像。 如果是这样,这个图像将被下载并运行以从该图像创build新的容器。 目前似乎我不得不使用docker命令列出registry( docker search )的内容,并将其与现有的本地容器( docker ps -a )进行比较,添加一些grep ing和awk ing或使用Docker API来实现同样的事情。

任何持久性数据将被写入已安装的卷,以便数据在创build新容器时能够存活。

这似乎可能是一个常见的模式,所以我想知道是否有其他人给了这种场景任何想法。

这就是我现在决定为我们的Neo4j Docker镜像所做的事情:

我已经编写了docker run的shell脚本,它接受端口的命令行参数,主机上的数据库持久性目录,主机上的日志文件持久性目录。 它执行如下所示的docker run命令:

 docker run --rm -it -p ${port}:7474 -v ${graphdir}:/var/lib/neo4j/data/graph.db -v ${logdir}:/var/log/neo4j my/neo4j 

默认情况下,端口是7474,graphdir是$ PWD / graph.db,而logdir是$ PWD / log。

--rm在退出时删除容器,但数据库和日志在主机的文件系统上维护。 所以没有留下容器。

-it允许容器和其中运行的Neo4j服务接收信号,以便服务可以正常closures(Neo4j服务器在SIGINT上正常closures),如果开发人员通过点击^ C或者发送一个SIGINT来退出容器把这个放在后台。 不需要单独的启动/停止命令。

虽然我当然不会在生产中做到这一点,但我认为这适合开发环境。

我不熟悉无花果,但你的情况似乎不错。

通常,我宁愿杀/删除+运行我的容器,而不是与开始/停止玩。 这样,如果有新的图像可用,Docker将使用它。 这项工作只适用于无状态服务。 由于您正在使用卷来存储持久性数据,因此可以这样做。

关于图像更新,每隔N分钟运行一次docker pull <image>然后检查命令返回的“状态”是什么? 如果它是最新的,则什么也不做,否则,杀死/重新运行容器。