【问题标题】:Docker compose run multiple commands one after anotherDocker compose一个接一个地运行多个命令
【发布时间】:2020-03-05 19:20:20
【问题描述】:

我最近开始使用 docker-compose,但我遇到了一个问题,即在谷歌搜索时我不会得到任何有用的答案。所以我想做的是一个接一个地运行2个命令。首先,我想训练我的模型,将训练好的模型放在一个文件夹中。然后第二个命令运行模型。但是,现在这两个命令一起启动,图像被加载两次,卷被创建两次。

所以我的问题是,如果可以一个接一个地运行多个命令,它是如何工作的?我也想知道,我的训练模型是如何放入 docker-compose 运行的卷中的?我可以以某种方式设置该卷的路径作为输出吗?

到目前为止我的 docker-compose 文件:

version: '3.3'
networks: {rasa-network: {}}
services:
  rasa:
    image: rasa/rasa:latest-full
    ports:
      - "5005:5005"
    volumes:
      - ./rasa/:/app/
    command:  run -vv -m models/test_model/ --enable-api --endpoints endpoints.yml --credentials credentials.yml
    networks: ['rasa-network']
    depends_on:
      - training
      - duckling
  duckling:
    image: rasa/duckling:latest
    ports:
      - "8000:8000"
    networks: ['rasa-network']
  training:
    build: .
    image: rasa/rasa:latest-full
    command: train --data data/ -c config.yml -d domain.yml --out models/test_model
    volumes:
      - ./rasa/:/app/

【问题讨论】:

  • 你可以在 Docker 之外或在你的镜像的 Dockerfile 中离线运行训练步骤吗?
  • 所以每次在我的服务器上运行其他命令之前,我都需要运行训练。 “在你的图像的 dockerfile 中”是什么意思?

标签: docker docker-compose rasa


【解决方案1】:

根据 depends_on 的文档,Docker compose 无法确定容器的就绪状态,因此一旦依赖项启动,就会启动最后一个容器,而忽略其他容器准备好了吗。

您可以做的解决方法是执行一个包装器 shell 脚本,该脚本控制依赖项(ducklingtraining)在启动 rasa 之前已完成其工作。这意味着,如果 rasa 需要其他两个容器中的一些文件,您可以创建一个脚本来检查这些文件是否存在循环。如果是这样,请退出循环并运行您拥有的命令。否则,请休眠几秒钟,然后重试。

那么,rasa 命令将只执行这个脚本,例如:

command: ["./wait-for-dependencies.sh", "duckling", "training"]

您可以在这里查看:https://docs.docker.com/compose/startup-order/,他们为类似的用例做了一些示例。

【讨论】:

  • 感谢您的帮助!我通过创建自己的图像文件来修复它,我在其中进行培训,然后在 docker-compose 中使用该图像。我不知道这是否是最干净的方式,但对我来说效果很好!
猜你喜欢
  • 1970-01-01
  • 2019-08-06
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多