我正在开发一个需要在首次运行时进行初始化的应用程序。
实际上,此操作将使用一些初始值初始化数据库,并将一些文件保存在持久卷中。如果我停止容器然后重新启动它,则我不想重新运行该引导程序。换句话说,如果容器存在并已填充,请跳过初始化例程。
我要实现的方式是有一个入口点脚本,该脚本检查配置文件是否存在,如果存在,将跳过引导程序,但是,我想知道是否有更好的方法?
例如,是否有一种运行脚本的方法,该脚本是由需要创建卷而专门触发的?如果可以的话,运行引导程序的唯一情况就是应用程序首次初始化时。
或者,是否有更好的,更多的Dockerish模式定义了我应该如何解决此问题?
答案 0 :(得分:1)
“如果文件不存在,请在入口点脚本中进行初始化”似乎是很习惯的做法。例如,the standard postgres:9.6 image检查$PGDATA/PG_VERSION
文件。
假设地,它看起来像:
#!/bin/sh
if [ ! -f /data/config.ini ]; then
/opt/myapp/setup-data.sh /data
fi
exec "$@"
请记住,出于多种原因删除和重新创建容器是非常常规的操作(IME停止和启动是因为动作很少,但是其中一些习惯是Docker较早产生的);这与您的直觉紧密相关为此,请使用入口点,因为它将在每个docker run
上启动。从您的容器中,您无法真正分辨出目录是卷还是卷,也没有可以绑定的钩子。在入口点开始时,容器环境已完全设置,并且已连接任何网络和卷。