在 Docker 撰写文件中定义任务

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)

这些任务可以用 docker-compose 定义吗?

我认为创建一个单独的容器来运行这个任务是有意义的。如果我将其定义为服务,它将如下所示。

  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,则退出的任务在执行后似乎仍然存在。

Dav*_*aze 5

这些任务可以用 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 脚本至少可以节省您一些打字和记忆的时间。