无法找到安装到自定义 docker 图像中的 python 软件包

can't find python packages installed into customized docker image

我正在创建一个 Docker 容器,其中 运行s Python 3.6.15 和我的 Docker 文件 运行s 中的 pip 安装功能构建过程,但是当我在构建完成后尝试在其中执行函数时,我 运行 它 'installed' 包不存在。

有关更多上下文,这是我的 Docker 文件。为清楚起见,我正在构建一个 Docker 容器,该容器正在上传到 AWS ECR 以用于 Lambda 函数,但我认为这与这个问题并不完全相关(尽管对上下文有益):

# Define function directory
ARG FUNCTION_DIR="/function"

FROM python:3.6 as build-image

# Install aws-lambda-cpp build dependencies
RUN apt-get clean && apt-get update && \
  apt-get install -y \
  g++ \
  make \
  cmake \
  unzip \
  libcurl4-openssl-dev \
  ffmpeg

# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Create function directory
RUN mkdir -p ${FUNCTION_DIR}

# Copy function code
COPY . ${FUNCTION_DIR}

# Install the runtime interface client
RUN /usr/local/bin/python -m pip install \
        --target ${FUNCTION_DIR} \
        awslambdaric

# Install the runtime interface client
COPY requirements.txt /requirements.txt
RUN /usr/local/bin/python -m pip install -r requirements.txt

# Multi-stage build: grab a fresh copy of the base image
FROM python:3.6

# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}

# Copy in the build image dependencies
COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}

COPY entry-point.sh /entry_script.sh
ADD aws-lambda-rie /usr/local/bin/aws-lambda-rie
ENTRYPOINT [ "/entry_script.sh" ]

CMD [ "app.handler" ]

当我在终端中 运行 我的 docker run 命令时,我可以看到它正在从我项目根目录中的 requirements.txt 文件中收集和安装包。然后我尝试 运行 得到一个导入模块错误。为了排除故障,我 运行 一些命令行 exec 函数,例如:

docker exec <container-id> bash -c "ls"  # This returns the folder structure which looks great

docker exec <container-id> bash -c "pip freeze". # This only returns 'pip', 'wheel' and some other basic Python modules

我能解决它的唯一原因是在我构建并 运行 它之后,我 运行 这个命令:

docker exec <container-id> bash -c "/usr/local/bin/python -m pip install -r requirements.txt"

手动安装模块,然后它们出现在 freeze 命令中,我可以执行代码。这并不理想,因为我希望在构建过程中正确设置 pip install 运行,这样以后我更改代码时的步骤会更少。

任何关于我哪里出错的指示都很好,谢谢!

根据Docker Docs, multi-stage builds

With multi-stage builds, you use multiple FROM statements in your Dockerfile. Each FROM instruction can use a different base, and each of them begins a new stage of the build. You can selectively copy artifacts from one stage to another, leaving behind everything you don’t want in the final image.

因此 Dockerfile 中的第二个 from python:3.6 重置映像构建,删除模块安装。

后续副本保存 /function(aws 模块)中的内容,但不保存其他 pip 安装中保存到系统的其他模块。