首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于电子代码编译的多级Dockerfile

用于电子代码编译的多级Dockerfile
EN

Code Review用户
提问于 2022-06-19 18:09:51
回答 2查看 263关注 0票数 2

我编写了一个Dockerfile来安装ecCodes,以便在使用cfgribX阵列的python环境中使用。

ecCode发布页面上可以找到tarball

Dockerfile

代码语言:javascript
复制
# 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 selfcheck

requirements.txt

代码语言:javascript
复制
attrs==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
EN

回答 2

Code Review用户

回答已采纳

发布于 2022-06-20 09:20:51

  • COPY + RUN tar不同,您可以让Docker通过使用ADD来进行提取,因为文件是从外部下载的:如果是以公认的压缩格式(identity、gzip、bzip2或xz)的本地tar存档,那么它将解压缩为一个目录。来自远程URL的资源是而不是解压缩的。当复制或解压缩目录时,它具有与tar -x相同的行为,其结果是:的联合。
    1. 无论目标路径上存在着什么
    2. 源树的内容,冲突的解决有利于“2”。一份一份的文件。

注意文件是否被识别为可识别的压缩格式完全是根据文件的内容而不是文件的名称来完成的。例如,如果一个空文件碰巧以.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更改时都不需要重新运行虚拟环境创建。)
票数 3
EN

Code Review用户

发布于 2022-06-19 18:28:28

小调:tar -xzf eccodes-2.24.2-Source.tar.gz可以简单地使用tar xf,因为扩展暗示了z;来自手册

在读取存档时必须指定解压缩选项的唯一情况是从不支持随机访问的管道或磁带驱动器中读取。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/277480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档