docker问题记录

1.基础镜像

  • base版本:
    该版本是从cuda9.0开始,包含了部署预构建cuda应用程序的最低限度(libcudart)。
    如果用户需要自己安装自己需要的cuda包,可以选择使用这个image版本,但如果想省事儿,则不建议使用该image,会多出许多麻烦。

  • runtime版本:
    该版本通过添加cuda工具包中的所有共享库开扩展基本image。如果使用多个cuda库的预构建应用程序,可使用此image。但是如果想借助cuda中的头文件对自己的工程进行编译,则会出现找不到文件的错误。

  • devel版本:
    通过添加编译器工具链,测试工具,头文件和静态库来扩展运行的image,使用此图像可以从源代码编译cuda应用程序。

总结:如果想用docker镜像做开发环境,建议使用devel版本的image

FROM nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04

# nvidia/cuda 表示从 dockerhub 里面的 nvidia/cuda 中下载
# 10.0 表示cuda版本
# cudnn7 表示cudnn版本
# devel 表示上面说的版本
# ubuntu18.04 表示系统名称

2.ENV

ENV DEBIAN_FRONTEND=noninteractive

ENV DISABLE_MULTIPROCESSING=1
# 本条命令还未找到合适的解释
  1. DEBIAN_FRONTEND这个环境变量,告知操作系统应该从哪儿获得用户输入。
  • 如果设置为”noninteractive”,你就可以直接运行命令,而无需向用户请求输入(所有操作都是非交互式的)。这在运行apt-get命令的时候格外有用,因为它会不停的提示用户进行到了哪步并且需要不断确认。非交互模式会选择默认的选项并以最快的速度完成构建。

  • 注意:请确保只在Dockerfile中调用的RUN命令中设置了该选项,而不是使用ENV命令进行全局的设置。因为ENV命令在整个容器运行过程中都会生效,所以当你通过BASH和容器进行交互时,如果进行了全局设置那就会出问题。

参考:DEBIAN_FRONTEND noninteractive参数

  1. DISABLE_MULTIPROCESSING

参考:Can we run multi-process program in docker?

3.apt-get

RUN apt-get update
RUN apt-get install -y --no-install-recommends python3.6 python3-pip

# 这里的python3.6 python3-pip 是我要安装的包
  1. 为什么要用 apt-get update ?
    问题:测试 docker ubuntu 镜像,无法直接通过 apt-get install 安装常用的包。
    解决:输入 apt-get update 命令之后,可以正常安装。
    原因:从运行过程可以看出,update读取所有源的软件列表,需要联网下载,作用是激活和更新源。

  2. 为什么要加 --no-install-recommends ?
    apt-get install 的“–no-install-recommends”标志,用它来防止安装不必要的“推荐”软件包。
    这有助于减少 Docker 镜像中一些不必要的膨胀。

参考:ubuntu官方

4.python -m

python help 中:

-m mod run library module as a script (terminates option list)

翻译:
"mod"是“module”的缩写,即“-m”选项后面的内容是 module(模块),其作用是把模块当成脚本来运行。

“terminates option list”意味着“-m”之后的其它选项不起作用,在这点上它跟“-c”是一样的,都是“终极选项”。官方把它们定义为“接口选项”(Interface options),需要区别于其它的普通选项或通用选项。

  • 为什么用 python -m pip install xxx ?
    我们可能会习惯性地使用“pip install xxx”,或者做了版本区分时用“pip3 install xxx”,总之不在前面用“python -m”做指定。但这种写法可能会出问题。
  • 参考:Brett Cannon的解释
    Brett Cannon:Python 的核心开发者、第一届指导委员会五人成员之一。

总结:记住最好不要用 pip install xxx,而是使用 python -m pip install xxx

5.python 和 python-dev

linux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el)包.

以python为例, 以下情况你是需要python-dev的:

  • 你需要自己安装一个源外的python类库, 而这个类库内含需要编译的调用python api的c/c++文件;
  • 你自己写的一个程序编译需要链接 libpythonXX.(a/so)
    (注:以上不含使用 ctypes/ffi 或者裸 dlsym 方式直接调用 libpython.so)
  • 其他正常使用python或者通过安装源内的python类库的不需要python-dev.

python-dev 的包名称:

  • Ubuntu 下名称 python-dev and python3-dev。
  • CentOS 下名称 python-devel and python3-devel。

参考:python-dev and python3-dev 软件包

总结:我直接指定了镜像源,所以没有安装 python3.6-dev 包,感觉大部分情况下都不需要。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值