我对容器非常陌生,我想知道在以下情况下是否存在“最佳实践”:
假设我已经使用多种软件工具开发了一条通用管道,以分析下一代测序数据(我从事科学工作)。我决定为此管道制作一个容器,以便与同事轻松共享它。该容器将安装必需的工具及其依赖项,以及运行管道的所有脚本。将有一些包装程序/主脚本来运行整个管道,例如:bash run-pipeline.sh -i输入data.txt
我的问题是:如果您为此目的使用容器,是否需要将数据放置在容器内,或者可以运行管道将数据放置在容器外部?换句话说,您是否必须将输入数据放入容器中然后在其上运行管道?
我正在努力寻找案例。
谢谢。
答案 0 :(得分:2)
要处理上述情况,我建议您使用文件在您的处理步骤之间交换数据。要将文件放入容器中,可以在容器中挂载本地目录。这也使您的容器具有某种持久性。以下示例显示了如何将本地文件系统挂载到容器中。
version: '3.2'
services:
container1:
image: "your.image1"
volumes:
- "./localpath:/container/internal"
container2:
image: "your.image2"
volumes:
- "./localpath:/container/internal"
container3:
image: "your.image3"
volumes:
- "./localpath:/container/internal"
该示例使用docker compose文件来描述容器之间的依赖关系。您可以在没有docker-compose的情况下实现相同的功能。然后,您必须在docker run命令中指定容器安装。
答案 1 :(得分:2)
对我来说,答案很明显-数据属于图像之外。
原因是,如果您使用内部数据构建图像,那么您的同事将如何将其与数据一起使用?
谈论容器内部或外部的数据没有任何意义。数据将在容器内。唯一的问题是它如何到达那里?
我推荐的过程类似于:
pipeline
。docker container create --mount type=bind,source=/path/to/data/files/on/host,target=/srv/data,readonly=true pipeline
当然,请使用适当的路径替换/ path / to / data / files / on / host。您可以将数据存储在一个地方,而同事则存储在另一个地方。您进行适合自己的替代,他们将不得不进行适合他们的替代。
但是,在容器内部,数据将位于/ srv / data。您的脚本可以假设它在那里。