带管道的容器:should/can 您将数据与容器分开
Containers with pipelines: should/can you keep your data separate from the container
我对容器很陌生,我想知道是否有针对以下情况的 "best practice":
假设我已经使用多种软件工具开发了一个通用管道来分析下一代测序数据(我从事科学工作)。我决定为这个管道做一个容器,这样我就可以很容易地与同事分享。容器将安装所需的工具及其依赖项,以及 运行 管道的所有脚本。会有一些 wrapper/master 脚本到 运行 整个管道,比如: bash 运行-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 组合文件来描述容器之间的依赖关系。您可以在没有 docker-compose 的情况下实现相同的功能。然后你必须在你的 docker 运行 命令中指定你的容器安装。
对我来说答案很明显 - 数据不属于图像。
原因是,如果你用里面的数据构建一个图像,你的同事将如何使用它们的数据?
谈论数据在容器内或容器外是没有意义的。数据将在容器内。唯一的问题是它是如何到达那里的?
我推荐的过程是这样的:
- 使用所有脚本、所需工具、依赖项等创建映像;但不是数据。为简单起见,我们将此图像命名为
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。您的脚本可以假设它会在那里。
我对容器很陌生,我想知道是否有针对以下情况的 "best practice":
假设我已经使用多种软件工具开发了一个通用管道来分析下一代测序数据(我从事科学工作)。我决定为这个管道做一个容器,这样我就可以很容易地与同事分享。容器将安装所需的工具及其依赖项,以及 运行 管道的所有脚本。会有一些 wrapper/master 脚本到 运行 整个管道,比如: bash 运行-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 组合文件来描述容器之间的依赖关系。您可以在没有 docker-compose 的情况下实现相同的功能。然后你必须在你的 docker 运行 命令中指定你的容器安装。
对我来说答案很明显 - 数据不属于图像。
原因是,如果你用里面的数据构建一个图像,你的同事将如何使用它们的数据?
谈论数据在容器内或容器外是没有意义的。数据将在容器内。唯一的问题是它是如何到达那里的?
我推荐的过程是这样的:
- 使用所有脚本、所需工具、依赖项等创建映像;但不是数据。为简单起见,我们将此图像命名为
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。您的脚本可以假设它会在那里。