为什么当容器在Kubernetes executor中运行时,conda包会丢失?

5ktev3wc  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(110)

我的目标是有一个gitlab CI/CD管道来为我构建conda包。对于非常大的项目,conda是如此缓慢,以至于gitlab超时,所以我们使用mamba代替。Gitlab使用Kubernetes runner,我注意到的是,当我在机器上本地构建/运行Docker容器时,它工作得很好,但是当Kubernetes executor运行它时,conda环境由于某种原因没有安装所需的包。
Docker镜像从这个Dockerfile生成:

FROM ubuntu:focal

SHELL ["/bin/bash", "-l", "-c"]
RUN apt-get update && apt-get install -y wget

# Install mamba
RUN wget -q -P /root/ https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh
RUN sh /root/Mambaforge-Linux-x86_64.sh -b
RUN /root/mambaforge/bin/conda shell.bash hook > /root/activatehook.sh

# Create an environment and install curl and numpy
RUN source /root/activatehook.sh && mamba create -n build-env -y -c conda-forge python=3.9
RUN source /root/activatehook.sh && conda activate build-env && mamba install curl numpy

现在,如果我在本地构建 *,我可以运行sudo docker run <my image> /bin/bash -c "source /root/activatehook.sh && conda activate build-env && mamba info && mamba list",我看到(除了其他事情之外):

  • 活动环境为build-env
  • curl已安装
  • numpy已安装

现在我把它移到我的gitlab CI脚本中:

stages:
  - test-stage

test-job:
  stage: test-stage
  tags:
    - kubernetes
  image: <my-image>
  script:
    - /bin/bash -c "source /root/activatehook.sh && conda activate build-env && mamba info && mamba list"

当它运行时,gitlab的输出表明:

  • 活动环境为build-env
  • curl已安装
  • numpy * 未安装 *!

我不知道该怎么办。conda环境存在并且处于活动状态,其中一个包已正确安装,但另一个没有安装。此外,当我将镜像拉到本地主机并手动运行相同的命令时,curlnumpy都按预期安装了!
同样重要的是:我知道mambaforge的docker镜像。我尝试过这样的东西:

FROM condaforge/mambaforge

RUN mamba create -y --name build-env python=3.9
RUN mamba install -n build-env -y -c conda-forge curl numpy==1.21

在这种情况下,我得到了类似的结果,除了从Kubernetes runner运行时,* 既没有安装curl也没有安装numpy *!如果我把镜像拉到本地主机上,同样,环境很好(两个包都正确安装)。有人能解释一下这种行为吗?

zu0ti5jz

zu0ti5jz1#

问题是无法执行“source”命令。要解决这个问题,您可以在Dockerfile中使用ENTRYPOINT。您可以按照以下步骤验证mamba列表中是否存在numpy库。
首先,你可以创建entrypoint.sh文件:

#!/bin/bash

source /root/activatehook.sh
conda activate build-env

exec "$@"

将入口点文件复制到容器中。(我丰富了Dockerfile的内容)
Dockerfile:

FROM ubuntu:focal

SHELL ["/bin/bash", "-c"]
WORKDIR /root/

RUN apt-get update && \
    apt-get install -y wget

RUN wget -q https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh
RUN bash Mambaforge-Linux-x86_64.sh -b -p /root/mambaforge
RUN rm /root/Mambaforge-Linux-x86_64.sh

ENV PATH="/root/mambaforge/bin:$PATH"

RUN conda shell.bash hook > /root/activatehook.sh

RUN source /root/activatehook.sh && \
    conda create -n build-env -y -c conda-forge python=3.9 && \
    echo "source /root/activatehook.sh && conda activate build-env" >> /root/.bashrc && \
    /root/mambaforge/bin/conda install -n build-env -c conda-forge -y curl numpy

COPY entrypoint.sh /root/entrypoint.sh
RUN chmod +x /root/entrypoint.sh

RUN apt-get -y autoclean && \
    apt-get -y autoremove && \
    rm -rf /var/lib/apt/lists/*

ENTRYPOINT ["/root/entrypoint.sh"]

gitlab CI脚本:

stages:
  - test-stage

test-job:
  stage: test-stage
  tags:
    - kubernetes
  image: <your-image>
  script:
    - /root/entrypoint.sh /bin/bash -c "mamba info && mamba list"

相关问题