如何在多阶段docker构建中设置netCDF4包?

问题描述 投票:0回答:1

我有一个现有的 dockerfile,它运行涉及 netCDF4 的 python 程序。这是一个简化版本:

ARG BASE_IMG=python:3.11-slim
ARG VENV="/opt/venv"

# ------------------------------ #
FROM $BASE_IMG
ARG VENV

RUN apt-get update && \
    apt-get upgrade && \
    apt-get install -y python3-dev libhdf5-dev libnetcdf-dev

RUN python -m venv $VENV
ENV PATH="$VENV/bin:$PATH"

RUN pip install numpy~=1.23.5 netcdf4~=1.6.4 h5py~=3.9.0

COPY test.py test.py

ENTRYPOINT ["python", "-m", "test"]

我的完整 dockerfile 还涉及一些 C++ 编译,我想将其隐藏到多阶段构建中,这样编译工具就不会出现在我的最终映像中。当我这样做时,我想我也可以在编译阶段

pip install
我的python包,并将整个venv移到最后阶段,如下所示:

ARG BASE_IMG=python:3.11-slim
ARG VENV="/opt/venv"

FROM $BASE_IMG as compile-image
ARG VENV

RUN apt-get update && \
    apt-get upgrade && \
    apt-get install -y python3-dev libhdf5-dev libnetcdf-dev

RUN python -m venv $VENV
ENV PATH="$VENV/bin:$PATH"

RUN pip install numpy~=1.23.5 netcdf4~=1.6.4 h5py~=3.9.0

# ------------------------------ #
FROM $BASE_IMG
ARG VENV

RUN apt-get update && \
    apt-get upgrade && \
    apt-get install -y libhdf5-dev libnetcdf-dev

COPY --from=compile-image $VENV $VENV
ENV PATH="$VENV/bin:$PATH"

COPY test.py test.py

ENTRYPOINT ["python", "-m", "test"]

这效果很好,除了通过这种方式复制 netCDF4 包似乎会导致 netcdf 读/写操作大幅减慢。我可以制作一个与上面的 Dockerfile 相同的 Dockerfile,我只是在最后阶段直接安装 netCDF4,而且我看到这种速度变慢,所以我认为 netCDF4 包有某种外部 c lib使用它我还需要复制过来。有谁知道如何确定 netCDF4 是否已正确链接到其所有库,或者我需要专门复制什么才能使其工作?

python docker netcdf netcdf4
1个回答
0
投票

使用 test_echam_spectral-deflated.nc 作为测试文件。不确定您对数据做了什么,但我的测试脚本加载了

.nc
文件中的所有变量:

🗎

test.py

import time
import numpy as np
from netCDF4 import Dataset

netcdf_file_path = '/data/test_echam_spectral-deflated.nc'

start_time = time.time()

dataset = Dataset(netcdf_file_path, mode='r')

for var in dataset.variables:
    np.array(dataset.variables[var][:])

end_time = time.time()

elapsed_time = end_time - start_time

print(f"Time taken to load the NetCDF file: {elapsed_time} seconds")

dataset.close()

数据通过卷挂载与容器共享。

我没有发现加载时间有显着差异。这是你的第一个

Dockerfile

这是第二个,多阶段

Dockerfile

您能否提供更多可用于重现问题的信息?

© www.soinside.com 2019 - 2024. All rights reserved.