我编写了一个Dockerfile来安装ecCodes,以便在使用cfgrib和X阵列的python环境中使用。
在ecCode发布页面上可以找到tarball
# syntax=docker/dockerfile:1
# ECCODE COMPILE
FROM python:3.10.4 as compiler
# /path/to/where/you/install/eccodes
ENV ECCODES_DIR=/usr/src/eccodes
# the zip file for eccodes
COPY ./eccodes-2.24.2-Source.tar.gz ./eccodes-2.24.2-Source.tar.gz
RUN apt-get update -y
# compiler tools
RUN apt-get install -y --no-install-recommends \
cmake \
gfortran \
build-essential
# unzip
RUN tar -xzf eccodes-2.24.2-Source.tar.gz
# prepare the build folders
RUN mkdir $ECCODES_DIR build && cd build
#
RUN cmake ../eccodes-2.24.2-Source -DCMAKE_INSTALL_PREFIX=$ECCODES_DIR -DENABLE_JPG=ON
RUN make && ctest && make install
# PYTHON BUILD
FROM python:3.10.4 as builder
ENV VIRTUAL_ENV=/opt/venv
COPY ./requirements.txt ./requirements.txt
# create the virtual env
RUN python3 -m venv $VIRTUAL_ENV
# upgrade pip
RUN python3 -m pip install --upgrade pip
# install the requirements
RUN pip install -r requirements.txt
# FINAL
FROM python:3.10.4
COPY --from=compiler $ECCODES_DIR $ECCODES_DIR
ENV ECCODES_DIR=$ECCODES_DIR
COPY --from=builder $VIRTUAL_ENV $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
RUN python -m cfgrib selfcheckattrs==21.4.0
cffi==1.15.0
cfgrib==0.9.10.1
click==8.1.3
eccodes==1.4.2
findlibs==0.0.2
numpy==1.22.4
packaging==21.3
pandas==1.4.2
pycparser==2.21
pyparsing==3.0.9
python-dateutil==2.8.2
pytz==2022.1
six==1.16.0
xarray==2022.3.0发布于 2022-06-20 09:20:51
COPY + RUN tar不同,您可以让Docker通过使用ADD来进行提取,因为文件是从外部下载的:如果是以公认的压缩格式(identity、gzip、bzip2或xz)的本地tar存档,那么它将解压缩为一个目录。来自远程URL的资源是而不是解压缩的。当复制或解压缩目录时,它具有与tar -x相同的行为,其结果是:的联合。注意文件是否被识别为可识别的压缩格式完全是根据文件的内容而不是文件的名称来完成的。例如,如果一个空文件碰巧以.tar.gz结尾--这将不会被识别为一个压缩文件,并且will not生成任何类型的解压缩错误消息,那么该文件将被简单地复制到目的地。
apt-get install -y不会抑制debconf问题(例如,在安装时区数据库包时选择本地时区)。但是,由于Docker没有提供一个终端,可以在其上显示debconf问题,因此无论如何都会自动回答这些问题,但这将导致构建日志中出现更多的噪音。您应该设置环境变量DEBIAN_FRONTEND=noninteractive来抑制debconf问题。关于码头的文件ENV有一个使用DEBIAN_FRONTEND的错误的示例:如果环境变量仅在构建过程中需要,而不是在最终映像中,请考虑为单个命令设置一个值:运行DEBIAN_FRONTEND=noninteractive apt-get update & apt-get -y .在这个命令中,DEBIAN_FRONTEND只会影响apt-get update,它不会问debconf问题。它应该是:运行apt-get更新& DEBIAN_FRONTEND=noninteractive apt-获取安装-y .或者:运行导出DEBIAN_FRONTEND=noninteractive;apt-获取更新&apt-获取安装-y .RUN命令在独立的shell和一个cd不会影响另一个目录中的工作目录中运行:请注意,每个指令都是独立运行的,并导致创建一个新的映像--因此RUN cd /tmp不会对下一个指令产生任何影响。您应该使用WORKDIR,因为它可以在目录不存在的情况下创建目录,所以跳过该目录的mkdir:运行mkdir "$ECCODES_DIR“WORKDIR构建运行cmake ./eccodes 2.24.2-Source -DCMAKE_INSTALL_PREFIX="$ECCODES_DIR”-DENABLE_JPG=ON (也引用变量)。RUN依赖于COPY,但是每次requirements.txt更改时,都会重新执行前面的RUN语句,即使缓存的结果是完全可用的: COPY ./Requiments.txt./requments.txt#创建虚拟env运行python3 -m venv $VIRTUAL_ENV #升级pip运行python3 -m pip安装--升级pip #安装需求运行pip安装-r requirements.txt --我建议:#创建虚拟env运行python3 -m venv "$VIRTUAL_ENV“升级pip运行python3 -m pip安装--升级pip副本。/quiments.txt./requments.txt#安装需求运行pip安装-r requirements.txt (或者在升级pip之前保持COPY。在这两种情况下,每次requirements.txt更改时都不需要重新运行虚拟环境创建。)发布于 2022-06-19 18:28:28
小调:tar -xzf eccodes-2.24.2-Source.tar.gz可以简单地使用tar xf,因为扩展暗示了z;来自手册:
在读取存档时必须指定解压缩选项的唯一情况是从不支持随机访问的管道或磁带驱动器中读取。
https://codereview.stackexchange.com/questions/277480
复制相似问题