我如何 运行 多个 docker 一个接一个地编写文件?

How do I run multiple docker-compose files AFTER each other?

我想进行一组实验,其中每个实验都被描述为一个 docker-compose。 结构如下:

Dataset
    A
       1 
          docker-compose-1.yml
          docker-compose-2.yml
       2 
          docker-compose-1.yml
          ...
    B
       1 
          docker-compose-1.yml
          ...

所有的组合都表现良好,也就是说,我 can/could 运行 一个接一个地手动组合它们,它们的行为符合预期。

我试了两次,第一次是 shell 文件如下:

#!/bin/bash

target_dir=../dataset

localizedCompose() {
    f=;
    ff=`basename ${f}`
    d=`dirname ${f}`

    l=`pwd`
    cd $d
    echo "Docker-Composing ${d}/${ff}"
    docker-compose -f $ff up
    echo "Docker-Compose finished ${d}/${ff}"
    docker-compose -f $ff down 
    echo "Docker-Compose cleaned-up"
    cd $l
}

export -f localizedCompose;

find $target_dir -name 'docker-compose*.yaml' -print0 | sort -zn | xargs -I {} bash -c 'localizedCompose "$@"' _ {}

的| sort -zn 是按顺序 运行 文件,这不是超级重要但会很好。

第一次撰写后结束。 同样,我尝试 运行 它“仅通过查找”,例如

find ./dataset -type f -name docker-compose*.yml -exec bash -c "docker-compose -f {} up ; docker-compose -f {} down" {} \;

这(令人惊讶地)也是 运行 它正确找到的第一个组合,但之后也会退出。

由于实验耗资源且需要定时,它们真的必须运行一个接一个,我不能将它们合并成一个大的组合。

您没有将 -0 参数传递给 xargs。如果没有这个,它将其标准输入解释为一系列 space 分隔的字符串;由于没有 spaces,它只运行一次命令;但 C 程序的典型约定是将空字节解释为字符串结尾,因此在实践中您只会得到第一个文件名。

find ... -print0 | xargs -0 ...

实际上我会尝试简化这个,可能使用 for 循环

for f in $(find "$target_dir" -name 'docker-compose*.yaml' -print | sort -n)
do
  localizedCompose "$f"
done

如果任何文件或目录名称中有 space,这可能会出现一些问题。如果您可以使用 bash 特定的语法,您应该能够避免这个问题:

shopt -o failglob globstar
for f in **/docker-compose*.yaml; do # automatically sorted
  localizedCompose "$f"
done

在函数内,Compose 通常会忽略工作目录,并考虑所有相对于(第一个)-f 选项位置的路径。你可以 trim 这个函数到

localizedCompose() {
  echo "docker-compose up "
  docker-compose -f "" up
  echo "docker-compose down "
  docker-compose -f "" down
  echo "done with "  
}