LABEL 语句
这个语句会为你的镜像添加元数据 。而且是完全可选的 。我增加这个语句的目的是为了让别人知道可以联系谁 。同时也方便我搜索我的 Docker 容器 。尤其是在一个服务器上同时运行着很多容器时 。
LABEL maintainer=\"Hamel Husain <youremail>\"
ENV 语句
ENV.UTF-8 LC_ALL=C.UTF-8
这让你可以修改环境变量 。而且相当直接 。相关情况请参阅:https://docs.docker.com/engine/reference/builder/
RUN 语句
这通常是最需要花功夫的地方 。给出了你构建该 Docker 镜像所想要完成的任务 。你可以运行 apt-get 和 pip install 等任意的 shell 命令来安装你需要的软件包和依赖包 。
RUN apt-get update --fix-missing && apt-get install -y wget bzip2
build-essential \
ca-certificates \
git-core \
...
在这里我安装了一些我喜欢的实用工具 。比如 curl、htop、byobu 。然后安装了 Anaconda 。之后还安装了一些基础 Anaconda 中没有的其它库(你可以在完整的 Dockerfile 中查看其它 RUN 语句) 。
RUN 语句后的命令与 Docker 没什么关系 。只是一些你在安装这些软件包时需要运行的正常 Linux 命令 。所以就算你不熟悉这些软件包或 Linux 命令也不要担心 。另外 。再给一个建议:当我最早开始学习 Docker 时 。我查看了 GitHub 或 DockerHub 上的其它 Dockerfile 。然后将我需要的部分复制粘贴到了我的 Dockerfile 。
你可能注意到了 RUN 语句的格式 。每个库或软件包都整齐地进行了缩进 。而且为了可读性还按字母进行了排序 。这是 Dockerfile 的普遍惯例 。所以我建议你也这样做以便合作 。
EXPOSE 语句
如果你想公开一个端口 。这个语句会很有用——比如 。如果你从该容器或某个网络服务内实施一个Jupyter Notebook 。Docker 的文档相当好地解释了 EXPOSE 语句:
EXPOSE 指令实际上并没有发布该端口 。它的功能是作为创建该镜像的人和运行该容器的人之间的一类文档 。内容是关于打算发布的端口 。要实际发布该端口 。就要在运行该容器时在 docker run 上使用 -p 标志并且映射一个或多个端口 。或者也可以使用 -P 标志发布所有端口并将它们映射到高阶端口 。
VOLUME 语句
VOLUME /ds
这个语句让你可以在 Docker 容器和主机计算机之间共享数据 。VOLUME 语句让你可以安装外部安装的卷 。主机目录只有在容器运行时才声明(因为你可能在不同的计算机上运行该容器) 。而不会在定义镜像时声明* 。目前你只指定了 Docker 容器内你想与主机容器共享的文件夹的名称 。
Docker 用户指南解释说:
主机目录是在容器运行时声明的:主机目录(挂载点)本质上取决于主机 。这是为了保证镜像的可移植性 。因为一个给定的主机目录无法保证在所有主机上都可用 。由于这个原因 。你不能在 Dockerfile 中挂载主机目录 。VOLUME 指令不支持指定 host-dir 参数 。你必须在创建或运行容器时指定挂载点 。
此外 。这些卷的目的是将数据保存到容器的文件系统之外 。当你要操作大量数据而且不希望你的镜像膨胀得很大时 。这会很有用 。当你保存一个 Docker 镜像时 。在这个 VOLUME 目录中的任何数据都不会被保存为该镜像的一部分 。但是在这个容器目录之外的数据会被保存 。
WORKDIR 语句
WORKDIR /ds
这个语句设置了工作目录 。以便你在另一条命令中可以无需使用绝对路径就能索引特定的文件 。例如这个 Dockerfile 中的最后一条语句是:
CMD [“./run_jupyter.sh”]
该语句就默认假设工作目录是 /ds
ADD 语句
ADD run_jupyter.sh /ds/run_jupyter.sh
这条命令让你可以在 Docker 容器运行时将文件从主机计算机复制到该 Docker 容器 。我使用这个命令来执行 bash 脚本以及将 .bachrc 文件等有用东西导入到容器中 。
注意这里的主机容器的路径并没有完全指定 。因为其主机路径是你在该容器运行时指定的背景路径(context directory)的相对路径(后面会讨论) 。
在我运行这个容器时 。run_jupyter.sh 正好在背景路径的根目录内 。所以在该源文件之前没有路径 。
用户指南中介绍说:
ADD <src>... <dest>
ADD 指令从 <src> 复制新文件、目录或远程文件 URL 并将它们添加到路径 <dest> 的镜像的文件系统中 。
CMD 语句
Docker 容器的设计思想是这些容器是短暂的 。能保证运行完你想运行的应用就行了 。但在数据科学方面 。我们往往希望保持这些容器一直运行 。即使它们之中并没有主动地运行着什么 。很多人都通过运行 bash shell 来实现这一点(除非你终止它 。否则它就不会停止) 。
推荐阅读
- 博氏巨蜥的价格
- 路易14玫瑰的花语 路易十四玫瑰花什么意思
- 还在担心移民岛国要花多少钱 其实移民这些小国可以省很多钱!
- 什么为落叶乔木 什么为落叶乔木?
- 没有钱,没有经验,要怎样创业?
- 美股熔断会重挫科技公司吗?未来一年科技和数码行业可能面临些什么?
- 哪种树被称为活化石? 哪种树被称为活化石
- 马耳他投资移民又要变政 2020年马耳他移民政策变动汇总
- 打工不如自己当老板,但是没有钱该如何创业呢?