我已经将一个老系统docker化了,我有一个docker-compose文件引用了一个基于postgres构建的镜像和一个基于tomcat构建的镜像。这个compose文件可以很好地启动和停止应用程序的测试版本。
Compose文件
services:
db:
image: mypostgres
container_name: db
networks:
- mynetwork
tomcat:
image: mytomcat
container_name: tomcat
networks:
- mynetwork
environment:
- myhost=localhost
volumes:
- "mydata:/mydata"
depends_on:
- db
在一个容器中运行任务
我有一些额外的命令行任务想要在系统上执行。其中一些任务需要大量计算资源。这些任务操作的是mydata卷中的文件。
目前,我使用以下命令在tomcat容器内运行此任务。
docker exec tomcat /bin/my-script.sh param
这些任务可以用docker-compose定义吗?
我认为,创建一个单独的容器来运行此任务是有意义的。如果我将其定义为服务,它将如下所示。
mycli:
image: mytomcat
networks:
- mynetwork
environment:
- myhost=tomcat
volumes:
- "mydata:/mydata"
depends_on:
- db
- mycli
entrypoint: /bin/myscript.sh
command:
- param
对于这种配置,最佳实践是什么?
将此添加到compose文件中的好处
- 长时间运行的任务在单独的容器中运行。
- 任务的可用性得到了很好的定义。
- 这可能是执行数据初始化任务的不错方式。
将此添加到compose文件中的不足之处
- 当服务启动时,必须执行某些操作。一旦该操作完成,容器就处于停止状态。
- 如果我使用
docker-compose run
来运行任务,则似乎已退出的任务会在执行后挂起。