我有一个现有的 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 是否已正确链接到其所有库,或者我需要专门复制什么才能使其工作?
使用 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
。
您能否提供更多可用于重现问题的信息?