我如何 运行 多个 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 "
}
我想进行一组实验,其中每个实验都被描述为一个 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 "
}