Давайте создадим простой змеиный файл вроде
rule targets:
input:
"plots/dataset1.pdf",
"plots/dataset2.pdf"
rule plot:
input:
"raw/{dataset}.csv"
output:
"plots/{dataset}.pdf"
shell:
"somecommand {input} {output}"
Я хочу обобщить правило сюжета, чтобы его можно было запускать внутри контейнера докеров, что-то вроде
rule targets:
input:
"plots/dataset1.pdf",
"plots/dataset2.pdf"
rule plot:
input:
"raw/{dataset}.csv"
output:
"plots/{dataset}.pdf"
singularity:
"docker://joseespinosa/docker-r-ggplot2"
shell:
"somecommand {input} {output}"
Если я хорошо понял, когда я запускаю snakemake --use-singularity
, я получаю, что somecommand
запускается внутри контейнера докеров, где входные файлы csv не могут быть найдены без некоторой конфигурации тома контейнера.
Не могли бы вы предоставить небольшой рабочий пример, описывающий, как можно настроить тома в Snakefile или других файлах Snakemake?
Когда вы запускаете snakemake и говорите ему использовать изображения сингулярности, вы делаете следующее:
snakemake --use-singularity
Вы также можете передать сингулярности дополнительные аргументы, включая точки привязки, например:
snakemake --use-singularity --singularity-args "-B /path/outside/container/:/path/inside/container/"
Теперь, если ваш CSV-файл находится в /path/outside/container/
, он может быть просмотрен какой-либо командой без проблем.
Имейте в виду, что если ваши внутренние и внешние пути не идентичны, вам нужно будет использовать оба пути в своем правиле создания змейки в разных разделах. Вот как я это сделал:
rule targets:
input:
"plots/dataset1.pdf",
"plots/dataset2.pdf"
rule plot:
input:
"raw/{dataset}.csv"
output:
"plots/{dataset}.pdf"
params:
i = "inside/container/input/{dataset}.csv",
o = "inside/container/output/{dataset}.pdf"
singularity:
"docker://joseespinosa/docker-r-ggplot2"
shell:
"somecommand {params.i} {params.o}"
Когда вы запускаете этот файл-змею, привяжите raw/
к inside/container/input/
и привяжите plots/
к inside/container/output/
. Snakemake будет искать файлы ввода / вывода на вашем локальном компьютере, но даст контейнеру команду для запуска с внутренними путями, и все будет замечательно.
TL; DR: локальные пути на входе и выходе, пути к контейнерам в параметрах и оболочке. Свяжите локальные пути и пути контейнера при вызове командной строки.
Ой, вы совершенно правы. Я изменю свой ответ выше!
Я получаю «snakemake: error: unrecognized arguments:» при использовании аргумента -B или -b. Разве формат не должен быть таким?
snakemake --use-singularity --singularity-args "-B <path_to_shared_directory>"