3-Dockerfile

3-Dockerfile

Dockerfile是什么

dockerfile是用来构建镜像的文件,包含了一条条的指令。

Dockerfile构建

  1. 每个保留关键词(指令)都必须是大写字母

  2. 从上到下顺序执行

  3. #表示注释

  4. 每一条指令构建镜像的一层

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 nginxRUN ["yum", "install" "-y", "nginx"]

RUN后面跟一个具体的命令,类似于Linux命令行执行命令。需要使用双引号""括起来,也可以直接写命令,不使用引号。

如果一个RUN指令执行多个命令,使用&&连接,命令过长,使用\换行。

一个RUN指令就是镜像的一层。

WORKDIR

格式:WORKDIR <path>

示例:WORKDIR /a:工作目录为/a

设置工作目录,适用于所有的RUNCMDENTRYPOINTADD等命令。

注意:可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径,如WORKDIR /home WORKDIR test,则最终工作目录为/home/test,路径也可以是环境变量,例如有环境变量HOME=/home,则WORKDIR $HOME/test就是/home/test

ADD

格式:ADD <src> <dest>ADD ["<src>", ... "<dest>"](用于支持包含空格的路径)

示例:

1
2
3
4
ADD hom* /mydir/                     # 添加所有以"hom"开头文件
ADD hom?.txt /mydir/ # ?代替一个单字符
ADD test relativeDir/ # 相对路径,以WORKDIR为基础路径
ADD test /absoluteDir/ # 绝对路径

将本机文件或远程文件拷贝到镜像中,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

注意:CMDENTRYPOINT都存在时,CMD的指令会变成ENTRYPOINT的参数,并且CMD提供的参数会被docker run后面的命令覆盖。

EXPOSE

格式:EXPOSE <port> [<port>...]

示例:

  • EXPOSE 80 443
  • EXPOSE 8080
  • EXPOSE 11211/tcp 11211/udp

指定Docker容器对外映射的容器端口号,可指定多个,也可指定网络协议tcpudp

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 JackMAINTAINER 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.gzdocker build - < http://server/context.tar.gz

例:构建自己的centos

编写Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM centos:centos7
MAINTAINER zhaoquaner@<zx1522202417@163.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN ["yum", "-y", "install", "net-tools"]

EXPOSE 1000

CMD echo $MYPATH
CMD echo "Build Image Successly"
CMD /bin/bash

centos7为基础镜像,设置维护人信息。

第4、5行设置环境变量,并设为工作目录。

第7、8行运行指令,安装vimnet-tools工具。

使用EXPOSE 1000将1000设为docker运行端口。

然后使用CMD指令打印信息,并在容器启动时运行/bin/bash命令。

使用docker build构建镜像:docker build -t mycentos .

现在可以运行容器:docker run -d -it mycentos,注意-d是以后台进程形式运行,这样容器就不会自行停止。

进入容器使用execexec创建一个新的终端,而attach是进入现有终端。

docker exec -it <imageID> /bin/bash


3-Dockerfile
https://zhaoquaner.github.io/2022/08/17/Docker/3-Dockerfile/
更新于
2022年8月18日
许可协议