我有一个docker映像,它封装了一些处理步骤:A
,B
,C
与线性依赖关系:A -> B -> C
。每一步都会产生一些后续步骤所需的工件(文件)。
什么是鲁棒性在这些约束条件下,如何运行这条管道?
一个简单的想法是编写一个shell脚本,每一步运行如下:
# run.sh
python step_a.py [args]
python step_b.py [args]
./step_c [args]
并定义run.sh
为docker镜像的ENTRYPOINT
。
这个足够好吗?有哪些潜在的警告?有没有更好的方法?
我更喜欢docker-compose
,但即使是depends_on
,也不能保证后续步骤只在前一个步骤完成后才运行。
我认为对dockerfile进行此操作的最稳健的方法是使用多阶段构建。
在其核心,多阶段构建只是将docker文件分解成多个更小的映像,您可以更精细地控制;因此,对于您的用例,您将为每个部分设置一个阶段。然后,您可以在各个阶段之间复制所需的工件。最后,由于需要输出而不是容器,因此可以将入口点设置为Rust二进制文件,然后让它输出所需的任何内容。它看起来就像这样
FROM python-3.8:latest AS stage-1 // this can be whatever image you want
RUN pip install requirements_1.txt // install the reqs for the first python file
RUN python_file_1.py
FROM python-3.8:latest AS stage-2 // again, whatever image you want
RUN pip install requirements_2.txt // same idea
COPY --from=stage-1 ./artifact_1 ./destination // this copies the artifact from running python_file_1.py to somewhere you want it to be. The paths here are obviously placeholders
RUN python_file_2.py
FROM rust:1.31
COPY --from=stage-2 ./artifact_2 ./destination
ENTRYPOINT ["./rust_binary"]
基本要点-
- 制作一些python镜像,为第一个python文件安装先决条件
- 运行第一个python文件
- 制作一些python图像,为第二个python文件安装先决条件
- 将所需工件从第一阶段复制到当前(第二)阶段
- 运行第二个python文件
- 制作一些rust映像,安装需要的东西
- 将所需工件从第二阶段复制到当前(第三)阶段
- 进入rust二进制文件的入口点,它应该产生您的输出