具有管道的容器:您是否/可以将数据与容器分开

时间:2019-02-18 12:53:29

标签: docker containers pipeline

我对容器非常陌生,我想知道在以下情况下是否存在“最佳实践”:

假设我已经使用多种软件工具开发了一条通用管道,以分析下一代测序数据(我从事科学工作)。我决定为此管道制作一个容器,以便与同事轻松共享它。该容器将安装必需的工具及其依赖项,以及运行管道的所有脚本。将有一些包装程序/主脚本来运行整个管道,例如:bash run-pipeline.sh -i输入data.txt

我的问题是:如果您为此目的使用容器,是否需要将数据放置在容器内,或者可以运行管道将数据放置在容器外部?换句话说,您是否必须将输入数据放入容器中然后在其上运行管道?

我正在努力寻找案例。

谢谢。

2 个答案:

答案 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命令中指定容器安装。

https://docs.docker.com/engine/reference/commandline/run/

答案 1 :(得分:2)

对我来说,答案很明显-数据属于图像之外。

原因是,如果您使用内部数据构建图像,那么您的同事将如何将其与数据一起使用?

谈论容器内部或外部的数据没有任何意义。数据将在容器内。唯一的问题是它如何到达那里?

我推荐的过程类似于:

  1. 使用所有脚本,必需的工具,依赖项等创建映像;但没有数据。为简单起见,我们将此图像命名为pipeline
  2. 将卷中的装入数据绑定到容器。 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。您的脚本可以假设它在那里。