博客
关于我
Dockerfile构建Python3.5环境---亲测可行代码
阅读量:296 次
发布时间:2019-03-03

本文共 2502 字,大约阅读时间需要 8 分钟。

因为比赛的需要,我不得不上传Docker镜像文件,但由于对Docker不太熟悉,花了一天时间终于大致弄明白了。其实可以这样理解:通过编写一个Dockerfile,把程序中需要的所有依赖项都封装进去,同时把自己的程序也一起装进去,这些东西就构成了一个Docker镜像文件,然后把这个镜像推送到云端,别人就可以用了。最难的部分就是如何写这个Dockerfile,尤其是指定使用CentOS构建环境的话,确实不太方便,如果不是为了比赛,选择Ubuntu环境可能会更舒服一些。

以下是一个上Python3.5环境的Dockerfile代码示例:

FROM nvidia/cuda:8.0-cudnn6-devel-centos7MAINTAINER Will_Ye# 安装你程序需要用到的所有依赖项,如Python,numpy,tensorflow等等RUN set -ex \    && yum install -y wget tar libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make initscripts \    && wget https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz \    && tar -zxvf Python-3.5.0.tgz \    && cd Python-3.5.0 \    && ./configure prefix=/usr/local/python3 \    && make \    && make install \    && make clean \    && cd .. \    && rm -rf /Python-3.5.0* \    && yum install -y epel-release \    && yum install -y python-pipRUN set -ex \    # 备份旧版本python    && mv /usr/bin/python /usr/bin/python27 \    # 配置默认为python3    && ln -s /usr/local/python3/bin/pip3 /usr/bin/pip \    && pip install scipy# 修复因修改python版本导致yum失效问题RUN set -ex \    && sed -i "s#/usr/bin/python#/usr/bin/python2.7#" /usr/bin/yum \    && sed -i "s#/usr/bin/python#/usr/bin/python2.7#" /usr/libexec/urlgrabber-ext-down \    && yum install -y deltarpm# 安装python3.5相关开发库RUN yum -y install python-devel scipy# 更新pipRUN pip install --upgrade pip# 安装其他依赖RUN pip install matplotlibRUN pip install --upgrade setuptoolsRUN pip install tensorflow-gpuRUN pip install Pillow# 注:opencv部分暂时搁置,后续有需要再补充# 安装waveRUN pip install wave# 安装scikit-imageRUN pip install scikit-image# 添加项目文件ADD ./competition/application.py /data/application.pyADD ./competition/model_weights20190430.h5 /data/model_weights20190430.h5# 定义入口命令CMD python /data/application.py

技术要点解析:

  • RUN set -ex

    这个命令的作用是将后续命令以批处理模式执行。如果任何一个命令出错,整个脚本就会停止执行,避免了后续命令因为前一步错误而无法执行的问题。这种情况在构建Python环境时尤为重要,因为环境搭建的每一步都很关键,任何一个错误可能导致后续问题无法解决。

  • mkdir -p /usr/local/python3.5

    这个命令的-p选项表示在目标目录的父目录不存在时,会自动创建父目录。这样可以避免手动创建目录的麻烦,减少代码量。

  • ADDCOPY 的区别

    ADD命令比COPY更强大,不仅可以复制本地文件到镜像,还可以通过URL直接下载文件到指定路径。COPY则只能从本地复制文件到镜像中。

  • MAINTAINER Will_Ye

    这行代码用于指定镜像的维护者,方便以后有问题时联系到你。

  • ENVRUN 的区别

    ENV用于设置环境变量,而RUN是用来执行命令的。如果需要在镜像构建完成后保留某个环境变量,可以使用ENV命令。

  • VOLUME 的作用

    使用VOLUME命令可以将镜像中的根文件系统设置为读写层,这样镜像本身不会被修改,只有容器中的文件才会改变,便于镜像共享和缓存。

  • CMD 的作用

    CMD命令指定了容器执行的入口命令。如果需要执行多个命令,可以使用CMD执行一个入口命令,内部使用&&连接多个命令。

  • ENTRYPOINT 的作用

    ENTRYPOINT用于指定容器的入口点,也就是容器运行时的执行命令。如果不指定的话,默认会从CMD中获取入口点。

  • 总结

    通过以上Dockerfile,我们可以轻松地构建包含所有依赖项和程序的镜像文件,然后将镜像推送到云端。其他人只需要下载这个镜像,就能直接运行你的程序,无需额外安装依赖项。

    转载地址:http://cxgl.baihongyu.com/

    你可能感兴趣的文章
    NiuShop开源商城系统 SQL注入漏洞复现
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 模型中的偏差和公平性检测
    查看>>
    Vue3.0 性能提升主要是通过哪几方面体现的?
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP三大特征抽取器:CNN、RNN与Transformer全面解析
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP度量指标BELU真的完美么?
    查看>>
    NLP的不同研究领域和最新发展的概述
    查看>>
    NLP的神经网络训练的新模式
    查看>>
    NLP采用Bert进行简单文本情感分类
    查看>>
    NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
    查看>>
    NLP项目:维基百科文章爬虫和分类【02】 - 语料库转换管道
    查看>>
    NLP:使用 SciKit Learn 的文本矢量化方法
    查看>>
    nmap 使用方法详细介绍
    查看>>
    Nmap扫描教程之Nmap基础知识
    查看>>