docker镜像中管道步骤的单一入口点



我有一个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"]

基本要点-

  1. 制作一些python镜像,为第一个python文件安装先决条件
  2. 运行第一个python文件
  3. 制作一些python图像,为第二个python文件安装先决条件
  4. 将所需工件从第一阶段复制到当前(第二)阶段
  5. 运行第二个python文件
  6. 制作一些rust映像,安装需要的东西
  7. 将所需工件从第二阶段复制到当前(第三)阶段
  8. 进入rust二进制文件的入口点,它应该产生您的输出

最新更新