从过去的经验来看…我有很多的技能都属于副产物…今天这个也是, 我的本意在于使用网易提供的NemuBox源代码编译出一个网易改进过的Virtualbox, 结果…我学了几样跟docker有关的技能…
镜像的构建是docker的基本, 虽然也可以每次创建好基础镜像后进入手动构建或者通过类似dockerhub这样的平台直接拉取, 但是前者耗时且重复性差, 后者对网络有一定要求且自定义性差. 掌握编写和修改Dockerfile这一构建图纸的使用方法还是很必要的. 况且…其实这东西也非常简单.
我在Dockerfile中可能会用的比较多的关键字有:
FROM
: 指定构建的基础镜像, 在构建开始前会pull指定的镜像作为构建基础.COPY
: 从外部(宿主流经)复制文件到镜像内, 第一个参数是外部路径, 第二个参数是内部路径, 具体参数用法类似cp
, 似乎不能多个文件同时使用, 没有尝试过通配符是否有效ADD
: 类似COPY
, 但是ADD
可以获取网络上的文件, 这在向其他地方部署容器时非常有用RUN
: 需要执行的命令WORKDIR
: 构建好的镜像在启动时进入的目录CMD
: 构建好的镜像在启动时运行的命令
这里COPY
和RUN
两个命令需要特别注意:
COPY
这个关键自在复制外部路径时, 只能获取docker build
制定的构建路径下以及其下层的文件. 这个时是受docker运行时**上下文(context)**的限制.RUN
命令每运行一次都会产生一层新镜像, 如果不是必须的, 最好精简需要运行的命令, 并将其以&&
连接在同一个RUN
下, 防止构建的镜像又大又慢.
这里我写一个之前工作时需要部署的R包sscClust
的例子:
1 | # |
其中涉及的R脚本为:
1 | options("repos" = c(CRAN="https://mirrors.ustc.edu.cn/CRAN/")) |
执行docker build -t=test_docker .
使用上面文件构建镜像
当然现在已经不保证这个例子能顺利构建了, 因为软件总是在不断更新, 而我的构建过程没有任何指定特定版本软件的内容, 随着时间的推进, 很有可能会出现各种依赖爆炸…不过作为使用记录还是阔以哒~