Docker 带管道的容器:您是否应该/能否将数据与容器分开

Docker 带管道的容器:您是否应该/能否将数据与容器分开,docker,containers,pipeline,Docker,Containers,Pipeline,我对集装箱非常陌生,我想知道对于以下情况是否有“最佳实践”: 假设我已经开发了一个通用管道,使用多种软件工具来分析下一代测序数据(我从事科学工作)。我决定为这个管道制作一个容器,这样我就可以很容易地与同事共享它。容器将安装所需的工具及其依赖项,以及运行管道的所有脚本。将有一些包装器/主脚本来运行整个管道,比如:bash run-pipeline.sh-i input data.txt 我的问题是:如果您为此目的使用容器,是否需要将数据放在容器内,或者是否可以运行管道,将数据放在容器外?换句话说,

我对集装箱非常陌生,我想知道对于以下情况是否有“最佳实践”:

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

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

我正在努力寻找一个案例


谢谢。

要处理所描述的场景,我建议您使用文件在处理步骤之间交换数据。要将文件放入容器中,可以将本地目录装入容器中。这也为容器提供了某种持久性。下面的示例显示了如何将本地文件系统装载到容器中

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命令中指定容器装载


要处理所描述的场景,我建议您使用文件在处理步骤之间交换数据。要将文件放入容器中,可以将本地目录装入容器中。这也为容器提供了某种持久性。下面的示例显示了如何将本地文件系统装载到容器中

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命令中指定容器装载


对我来说,答案是显而易见的——数据不属于图像

原因是,如果您构建了一个包含数据的图像,那么您的同事将如何将其与数据一起使用

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

我推荐的流程如下:

  • 创建一个包含所有脚本、所需工具、依赖项等的映像;但不是数据。为了简单起见,让我们将此图像命名为
    pipeline
  • 将卷中的装载数据绑定到容器<代码>docker容器创建--装载类型=绑定,源=/path/to/data/files/on/host,目标=/srv/data,只读=真管道
  • 当然,用适当的路径替换/path/to/data/files/on/host。您可以将数据存储在一个位置,将同事存储在另一个位置。你做了一个适合你的替代品,他们将不得不做一个适合他们的替代品


    但是在容器内部,数据将位于/srv/data。您的脚本可以假定它将在那里。

    对我来说,答案是显而易见的-数据属于图像之外

    原因是,如果您构建了一个包含数据的图像,那么您的同事将如何将其与数据一起使用

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

    我推荐的流程如下:

  • 创建一个包含所有脚本、所需工具、依赖项等的映像;但不是数据。为了简单起见,让我们将此图像命名为
    pipeline
  • 将卷中的装载数据绑定到容器<代码>docker容器创建--装载类型=绑定,源=/path/to/data/files/on/host,目标=/srv/data,只读=真管道
  • 当然,用适当的路径替换/path/to/data/files/on/host。您可以将数据存储在一个位置,将同事存储在另一个位置。你做了一个适合你的替代品,他们将不得不做一个适合他们的替代品


    但是在容器内部,数据将位于/srv/data。您的脚本可以假定它将在那里。

    好的,谢谢。我只是不确定我是否理解管道中的容器如何“连接”到我的文件,如果我的文件不在容器中。但你是说启动容器后的第一步是将我的文件放在其中?@m93或多或少是的。我会更新我的答案,提供更多细节。谢谢@emory!因此,如果我理解得很好,通过装载数据,我根本不必“移动”数据,我只是在我的计算机操作系统和容器之间共享一个文件夹,对吗?最后一件事:这个“docker container create”命令,在我使用“docker stop”停止容器运行后,装载是否会持续(如果出于某种原因我必须停止它?),或者每次再次启动容器时我是否必须重新装载文件夹?是的。我认为这是一件好事。我想在我的数据上应用你令人敬畏的管道。为什么我要将您的管道应用于您的数据—这是您的工作。装载将在停止和重新启动容器之间持续。如果您
    docker container rm
    您的容器,那么挂载将不再存在-删除容器将删除挂载。@m93这是一个与我预期的截然不同的用例。不是说你做错了什么,但也许我的建议不适用。好的,谢谢。我只是不确定我是否理解管道中的容器如何“连接”到我的文件,如果我的文件不在容器中。但你是说第一步,