Dockerfile
今天带来dockerfile的第二篇文档————Dockerfile,Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。我们可以用java的源码和class文件进行类比,如果我们将image文件比做为一个个类文件,那么Dockerfile就可以看成是源码文件。当我们在Dockerfile文件中写好我们希望构建的镜像之后,可以使用docker build来读取Dockerfile中的指令构建我们的镜像。
一. Dockerfile相关指令以及build指令
- FORM 基础镜像,当前新镜像是基于哪个镜像的
- MAINTAINER 镜像维护者的姓名和邮箱
- RUN 容器构建时需要运行的命令
- EXPOSE 当前容器对外暴露出的端口
- WORKDIR 指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点
- ENV 用来在构建镜像过程中设置环境变量
- ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
- COPY 类似ADD,拷贝文件和目录到镜像中,注意这个不会解压
- VOLUME 容器数据卷,用于数据保存和持久化操作
- CMD 指定一个容器启动时要运行的命令,dockerfile可以有多个cmd,但是只有最后一个生效
- ENTRYPOINT 指定一个容器启动时要运行的命令,不会被覆盖,会追加
- ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild会被触发,类似于一个触发器
build指令解释如下:
1 | docker build [OPTIONS] PATH | URL | - |
关于options有一些说明:
- –build-arg=[] :设置镜像创建时的变量
- –cpu-shares :设置 cpu 使用权重;
- –cpu-period :限制 CPU CFS周期;
- –cpu-quota :限制 CPU CFS配额;
- –cpuset-cpus :指定使用的CPU id;
- –cpuset-mems :指定使用的内存 id;
- –disable-content-trust :忽略校验,默认开启;
- -f :指定要使用的Dockerfile路径;
- –force-rm :设置镜像过程中删除中间容器;
- –isolation :使用容器隔离技术;
- –label=[] :设置镜像使用的元数据;
- -m :设置内存最大值;
- –memory-swap :设置Swap的最大值为内存+swap,”-1”表示不限swap;
- –no-cache :创建镜像的过程不使用缓存;
- –pull :尝试去更新镜像的新版本;
- –quiet, -q :安静模式,成功后只输出镜像 ID;
- –rm :设置镜像成功后删除中间容器;
- –shm-size :设置/dev/shm的大小,默认值是64M;
- –ulimit :Ulimit配置。
- –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- –network: 默认 default。在构建期间设置RUN指令的网络模式
下面我们举一个例子来构建自己的dockerfile
1 | FROM contos |
这里我们引入原始的centos镜像,然后设置工作路径为 /usr/local,并在这个linux系统中装入vim和net-tools组建,最后我们输出我们的工作路径和success。
使用build指令进行镜像构建
1 | docker build -f /mydocker/DockerFile -t mycentos:1.3 . |
这里我遇到了一个坑,就是我是在根目录下构建的images,就会出现问题
1 | Error checking context: 'no permission to read from'/proc/sys/net/ipv4/route/flush''. |
这里我们一定不要在根目录下进行build操作。
最终结果就是成功构建,我们使用docker images 可以看到: