决定何时使用 'docker run' 与'docker start'以及使用给定映像的最新版本的策略



我正在对我们的一些服务进行码头化。对于我们的开发环境,我想让我们的开发人员尽可能轻松,所以我正在编写一些脚本来管理码头化的组件。我希望开发人员能够启动和停止这些服务,就好像它们是非码头化的一样。我不想让他们担心创建和运行容器,而不是停止和启动已经创建的容器。我想这可以用Fig.来处理。为了创建容器(如果它还不存在)并启动服务,我会使用配置——而不是重新创建。要停止服务,我会使用fig stop

我还想确保开发人员运行使用最新图像构建的容器。换句话说,我们会检查Docker注册表中是否有更新版本的映像。如果是这样,则会下载并运行此映像,以便从该映像创建一个新容器。目前,我似乎必须使用docker命令来列出注册表的内容(docker搜索),并将其与现有的本地容器(docker ps-a,添加一些greping和awkng)进行比较,或者使用docker API来实现同样的目的。

任何持久性数据都将被写入已装入的卷中,因此数据应该在创建新容器后仍然存在。

这似乎是一种常见的模式,所以我想知道是否有其他人考虑过这种情况。

这就是我现在决定为我们的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服务接收信号,以便服务可以正常关闭(Neo4j服务器在SIGINT上正常关闭),并且如果开发人员将其放在后台,则容器通过点击^C或向其发送SIGINT退出。不需要单独的启动/停止命令。

虽然我肯定不会在生产中这样做,但我认为这对开发环境来说很好。

我不熟悉fig,但您的场景似乎不错。

通常,我更喜欢杀死/删除+运行我的容器,而不是玩启动/停止。这样,如果有新的镜像可用,Docker就会使用它。这只适用于无状态服务。当您将卷用于持久数据时,可以执行以下操作。

关于图像更新,每N分钟运行一次docker pull <image>并检查命令返回的"状态"如何?如果它是最新的,则不执行任何操作,否则,终止/重新运行容器。

最新更新