3-Dockerfile
3-Dockerfile
Dockerfile是什么
dockerfile是用来构建镜像的文件,包含了一条条的指令。
Dockerfile构建
每个保留关键词(指令)都必须是大写字母
从上到下顺序执行
#
表示注释每一条指令构建镜像的一层
Dockerfile常用命令
FROM
格式:FROM <image>
,FROM <image>:<tag>
, FROM <image>@<digest>
示例:FROM mysql:5.6
Dockfile的第一行命令必须为FROM
,后跟镜像名称,代表将要构建的镜像要以哪个镜像为基础。
如果本地没有基础镜像,就会从公共库拉取。
Docker存在一个特殊镜像scratch
,这个镜像并不实际存在,它表示一个空白的镜像。
如果以scratch
为基础镜像,那表示不以任何镜像为基础,接下来所写的指令将作为镜像第一层。
RUN
格式:RUN <command>
示例:RUN yum install -y nginx
或RUN ["yum", "install" "-y", "nginx"]
RUN
后面跟一个具体的命令,类似于Linux命令行执行命令。需要使用双引号""
括起来,也可以直接写命令,不使用引号。
如果一个RUN
指令执行多个命令,使用&&
连接,命令过长,使用\
换行。
一个RUN
指令就是镜像的一层。
WORKDIR
格式:WORKDIR <path>
示例:WORKDIR /a
:工作目录为/a
设置工作目录,适用于所有的RUN
、CMD
、ENTRYPOINT
,ADD
等命令。
注意:可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径,如WORKDIR /home WORKDIR test
,则最终工作目录为/home/test
,路径也可以是环境变量,例如有环境变量HOME=/home
,则WORKDIR $HOME/test
就是/home/test
。
ADD
格式:ADD <src> <dest>
, ADD ["<src>", ... "<dest>"]
(用于支持包含空格的路径)
示例:
1 |
|
将本机文件或远程文件拷贝到镜像中,tat
类型压缩文件会自动解压(网络压缩资源不会被解压)。
注意:需要复制的本地文件要放在Dockerfile文件的同级目录下。
COPY
与ADD
基本类似,区别是COPY
命令不会自动解压文件,也不能访问网络资源。
CMD
格式:CMD ["executable", "param1", "param2"]
:执行可执行文件,优先
CMD command param1 param2
:执行shell内部命令
示例:
CMD echo "This is a test"
CMD ["usr/bin/wc", "--help"]
指定容器启动时要执行的命令,即容器启动时进行调用。如果有多个cmd
命令,最后一个生效。
作用是在启动容器时提供一个默认的命令项,如果用户在执行docker run
时提供了命令项,就会覆盖 掉这个命令,没有提供就使用该命令。
ENTRYPOINT
格式:ENTRYPOINT ["executable", "param1", "param2"]
:可执行文件,优先
ENTRYPOINT command param1 param2
:shell内部命令
示例:ENTRYPOINT ["top", "-b"]
指定容器启动时要执行的命令,如果有多个ENTRYPOINT
指令,只有最后一个会生效。和CMD
命令一样,唯一的区别是不能被docker run
命令覆盖,docker run
指定的任何参数,会被当做参数传递给ENTRYPOINT
.
如果要覆盖,需要带上选项--entrypoint
。
注意:当CMD
和ENTRYPOINT
都存在时,CMD
的指令会变成ENTRYPOINT
的参数,并且CMD
提供的参数会被docker run
后面的命令覆盖。
EXPOSE
格式:EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
指定Docker容器对外映射的容器端口号,可指定多个,也可指定网络协议tcp
或udp
。
在docker run -p
时生效,或使用- P
发布所有端口。
VOLUME
格式:VOLUME ["path" ...]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2"]
创建匿名挂载数据卷。用于指定持久化目录。VOLUME
指令中的路径是针对容器的。
注意:为了镜像的可移植性,VOLUME
指令不支持指定主机目录参数。
如果要指定,需要在运行容器时使用-v
选项;
如果不指定,会自动挂载到/var/lib/docker/volumes
的匿名目录中。
ENV
格式:
ENV <key> <value>
:<key>
后的所有内容会被视为<value>
的一部分,因此一次只能设置一个变量ENV <key=value> ...
:可以设置多个变量,如果<key>
包含空格,使用\
转义,\
也可用于换行
示例:
ENV name Jack
ENV name=jack sex=male
ARG
格式:ARG <key>=[=<default value>]
:即可以不指定value值
示例:
ARG site
ARG build_user=www
构建参数,与ENV
作用一致,不过作用域不同。ARG
设置的环境变量仅在Dockerfile内有效。也就是说只在docker build
过程中有效,构建好的镜像中不存在此环境变量。
MAINTAINER
格式:MAINTAINER <name>
示例:MAINTAINER Jack
, MAINTAINER jack@163.com
维护者信息,例如姓名,邮箱等。
LABEL
格式:LABEL <key>=<value> <key>=<value> ...
示例:LABEL version="1.0 description="测试
LABEL
指令以键值对的形式给镜像添加元数据metadata
。
指定多条元数据时通过空格分隔,推荐使用一条LABEL
指令指定所有元数据,避免生成过多中间镜像。
ONBUILD
格式:ONBUILD [instruction]
示例:ONBUILD ADD . /app/src
设置当前所创建的镜像作为其他要构建的镜像的基础镜像时,所执行的操作指令。
简单来说,就是一个镜像触发器。当该镜像创建后,如果其他镜像以该镜像为基础,会先执行这个镜像的ONBUILD
命令。
USER
格式:
USER:user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
指定运行容器时的用户名或UID,后续操作都会使用指定用户。使用USER
指令指定用户时,可以使用用户名、UID或GID,或是组合。当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在之前创建所需要的用户。
运行容器docker run
时,可使用-u
覆盖指定的用户。
Dockerfile构建镜像
使用docker build
命令构建镜像。
格式:docker build [OPTIONS] <PATH | URL | - >
例如:
使用当前目录的Dockerfile创建镜像,标签为zhaoxin/ubuntu:1.0
docker build -t zhaoxin/ubuntu:1.0
也可使用.
代表当前目录,docker build -t zhaoxin/ubuntu:1.0 .
还可使用URL进行构建,使用URL github.com/creack/docker-firefox
的Dockerfile
docker build -t firefox github.com/creack/docker-firefox
也可以通过选项-f
指定Dockerfile文件位置
docker build -f /path/to/Dockerfile
用给定的压缩包构建
docker build - < context.tar.gz
或docker build - < http://server/context.tar.gz
例:构建自己的centos
编写Dockerfile
1 |
|
以centos7
为基础镜像,设置维护人信息。
第4、5行设置环境变量,并设为工作目录。
第7、8行运行指令,安装vim
和net-tools
工具。
使用EXPOSE 1000
将1000设为docker运行端口。
然后使用CMD
指令打印信息,并在容器启动时运行/bin/bash
命令。
使用docker build
构建镜像:docker build -t mycentos .
现在可以运行容器:docker run -d -it mycentos
,注意-d
是以后台进程形式运行,这样容器就不会自行停止。
进入容器使用exec
, exec
创建一个新的终端,而attach
是进入现有终端。
docker exec -it <imageID> /bin/bash