更详细的规范与说明请参考 Dockerfile reference。这里我们以基于上面的 joe/centos:v1 作为基础镜像,然后在根目录创建 a 目录为例。
创建Dockerfile文件名为a. 如下:
FROM joe/centos:v1
RUN mkdir a
然后使用当前目录的Dockerfile创建镜像,不需要指定文件名
命令如下:
docker build -t runoob/ubuntu:v1 .
执行:
> docker build -t newfiledocker:v1 .
Sending build context to Docker daemon 3.584kB
Step 1/2 : FROM joe/centos:v1
---> 68e83119eefa
Step 2/2 : RUN mkdir a
---> Running in 1127aff5fbd3
Removing intermediate container 1127aff5fbd3
---> 25a8a5418af0
Successfully built 25a8a5418af0
Successfully tagged newfiledocker:v1
新建基于 newfiledocker 的容器并在终端中打开,发现里面已经有 a 文件夹了。
> docker docker run -it newfiledocker:v1 /bin/bash
root@e3bd8ca19ffc:/# ls
a bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
其他使用dockfile的方式
指定使用的dockerfile
使用命令
vim -f /soft/docker/Dockerfile
#输入dockerfile的内容,保存退出
docker build -t newfiledocker:v1 -f /soft/docker/Dockerfile
FROM scratch
…
如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。
不以任何系统为基础,直接将可执行文件复制进镜像的做法并不罕见,比如 swarm、coreos/etcd。对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 FROM scratch 会让镜像体积更加小巧。使用 Go 语言 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go 是特别适合容器微服务架构的语言的原因之一。
借助 Dockerfile 的能力,Docker 留下了无限的可能。