ter*_*ywb 5 docker docker-compose
我已经对我工作的旧系统进行了docker化。我有一个 docker compose 文件,它引用了一个构建在 postgres 上的图像和一个构建在 tomcat 上的图像。此撰写文件适用于启动和停止应用程序的测试版本。
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
Run Code Online (Sandbox Code Playgroud)
我想在系统上执行一些额外的命令行任务。其中一些任务是计算密集型的。这些任务对 mydata 卷中的文件进行操作。
目前,我使用以下命令在 tomcat 容器中运行此任务。
docker exec tomcat /bin/my-script.sh param
Run Code Online (Sandbox Code Playgroud)
我认为创建一个单独的容器来运行这个任务是有意义的。如果我将其定义为服务,它将如下所示。
mycli:
image: mytomcat
networks:
- mynetwork
environment:
- myhost=tomcat
volumes:
- "mydata:/mydata"
depends_on:
- db
- mycli
entrypoint: /bin/myscript.sh
command:
- param
Run Code Online (Sandbox Code Playgroud)
这种配置的最佳实践是什么?
docker-compose run
,则退出的任务在执行后似乎仍然存在。这些任务可以用 docker-compose 定义吗?
不; 该docker-compose.yml
文件仅定义长期运行的“服务”容器。无法定义docker exec
在已启动的容器上运行的附加类型任务。原则上,您可以定义额外的“服务”来执行其工作单元并立即退出,但每次运行时docker-compose up
它都会想要重新运行所有这些服务。
数据初始化任务
如果您有一些东西需要在首次启动时运行(例如预加载数据)或每次启动时运行(可能是数据库迁移),您可以构建容器,以便它在主应用程序启动之前运行。我倾向于在入口点脚本中执行此类操作;它将容器的命令作为命令行参数,因此它有机会根据正在运行的命令做出决定,进行所需的设置,然后实际启动该命令。
#!/bin/sh
if [ "$1" = "theapp" ]; then
# Hypothetically: if we're starting theapp, run its migrations
# first before running the service itself
theapp migrate
fi
# Now do whatever the command is
exec "$@"
Run Code Online (Sandbox Code Playgroud)
这种模式的一个特别涉及的示例是mysql 映像的入口点:如果它正在启动数据库,并且数据目录尚不存在,那么它会执行所有首次设置,并在执行此操作时启动临时数据库服务器。
我想要执行的其他 [...] 任务
您可能会看到是否可以添加触发它们的网络调用,无论是在受保护的“管理”URL 路径上还是在未外部发布的单独端口上。这将避免需要获取 root shell 来执行日常维护任务的问题。
如果做不到这一点,一个用于自动执行任务及其参数的 shell 脚本至少可以节省您一些打字和记忆的时间。
归档时间: |
|
查看次数: |
2230 次 |
最近记录: |