docker geovis_Docker专栏—Dockerfile详细介绍

编写Dockerfile

FROM指令和MAINTAINER指令

adbaaf89061c5300f1d26ce28f70c31d.png

脚本的第1行是FROM指令。通过FROM指令,docker编译程序能够知道在哪个基础镜像执行来进行编译。所有的Dockerfile都必须以FROM指令开始。第二条指令MAINTAINER,用来标明这个镜像的维护者信息。

RUN指令

a012c9b35c0e73cc82d5939fa515d2a2.png

接下来是RUN指令。这条指令用来在docker的编译环境中运行指定命令。上面这条指令会在编译环境运行/bin/sh -c "apt-get update && apt-get -y install ..."。RUN指令还有另外一种格式:

RUN ["程序名", "参数1", "参数2"]

复制代码

这种格式运行程序,可以免除运行/bin/sh的消耗。这种格式使用Json格式将程序名与所需参数组成一个字符串数组,所以如果参数中有引号等特殊字符,需要进行转义。

ENV指令

1bc8d2485e25482db92c96497e130098.png

ENV指令用来指定在执行docker run命令运行镜像时,自动设置的环境变量。这些环境变量可以通过docker run命令的--evn参数来进行修改。

COPY指令和ADD指令

fc34bb9be2b1ecc1a2b3fc1585d2fcf1.png

COPY指令用来将本地(Dockerfile所在位置)的文件或文件夹复制到编译环境的指定路径下。上面的例子里,boot2docker的Dockerfile希望将与Dockerfile同一目录下的kernel_config文件复制到编译环境的/linux-kernal/.config。Dockerfile还提供了另外一个类似的指令:ADD。在复制文件方面ADD指令和COPY指令的格式和效果是完全一样的。这两个指令的区别主要由两点:

ADD指令可以从一个URL地址下载内容复制到容器的文件系统中;

ADD指令会将压缩打包格式的文件解开后复制到指定位置,而COPY指令只做复制操作。

CMD指令

edef6e30078485b91cb5182ee4520dc3.png

这是整个Dockerfile脚本的最后一条指令。当Dockerfile已经完成了所有环境的安装与配置,通过CMD指令来指示docker run命令运行镜像时要执行的命令。上面的例子里,在完成所有工作后,boot2docker的编译脚本将编译结果输出到本地环境下。

其他指令

上面我们通过boot2docker的Dockerfile脚本学习了几个最常用的指令。接下来我们再学习剩下的几个指令。

EXPOSE指令

EXPOSE [...]指令用于标明,这个镜像中的应用将会侦听某个端口,并且希望能将这个端口映射到主机的网络界面上。但是,为了安全,docker run命令如果没有带上响应的端口映射参数,docker并不会将端口映射出了。

ENTRYPOINT指令

ENTRYPOINT指令和前面介绍过的CMD一样,用于标明一个镜像作为容器运行时,最后要执行的程序或命令。这两个指令有相同之处,也有区别。通过两个指令的配合使用可以配置出不同的效果。

ENTRYPOINT指令有两种格式,CMD指令有三种格式:

ENTRYPOINT ["程序名", "参数1", "参数2"]

ENTRYPOINT 命令 参数1 参数2

CMD ["程序名", "参数1", "参数2"]

CMD 命令 参数1 参数2

CMD 参数1 参数2

复制代码

ENTRYPOINT是容器运行程序的入口。也就是说,在docker run命令中指定的命令都将作为参数提供给ENTRYPOINT指定的程序。同样,上面列举的CMD指令格式的后面两种格式也将作为参数提供给ENTRYPOINT指定的程序。

默认的ENTRYPOINT是/bin/sh -c。你可以根据实际需要任意设置。但是如果在一个Dockerfile中出现了多个ENTRYPOINT指令,那么,只有最后一个ENTRYPOINT指令是起效的。

一种常用的设置是将命令与必要参数设置到ENTRYPOINT中,而运行时只提供其他选项。例如:你有一个MySQL的客户端程序运行在容器中,而客户端所需要的主机地址、用户名和密码你不希望每次都输入,你就可以将ENTRYPOINT设置成:ENTRYPOINT mysql -u -p -h 。而你运行时,只需要指定数据库名。

VOLUME指令

VOLUME ["路径"]

复制代码

VOLUME指令用于在容器内创建一个或多个卷。而更多的时候,是在执行docker run时指定要创建的卷以及本地路径来进行映射。关于这个用法将在后面的章节学习到。

USER指令

USER 用户名或用户ID

复制代码

USER指令用于容器内运行RUN指令或CMD指令的用户。例如,在构建一个nginx镜像时,你希望最后运行nginx的用户为nginx,就可以在CMD ["nginx"]之前将用户设置为nginx。

如果在运行docker run命令时设置了-u 用户名参数,那么将覆盖USER指令设置的用户。

WORKDIR指令

WORKDIR 路径

复制代码

WORKDIR指令用于设置执行RUN指令、CMD指令和ENTRYPOINT指令执行时的工作目录。在Dockerfile中可以多次设置WORKDIR,在每次设置之后的命令将使用新的路径。

ONBUILD指令

ONBUILD 指令

复制代码

ONBUILD指令用于设置一些指令,当本镜像作为基础镜像被其他Dockerfile用FROM指令引用时,在所有其他指令执行之前先执行这些指令。

备注

举例说明 ENTRYPOINT和CMD的区别

dockerfile 中只有CMD ["cat","/etc/passwd"],启动docker

docker run -itd --name docker_name docker_image

复制代码

以上启动docker后,会直接执行cat /etc/passwd.和直接执行

docker run -itd --name docker_name docker_image cat /etc/passwd

复制代码dockerfile 中只有ENTRYPOINT ['cat'],启动docker

docker run -itd --name docker_name docker_image /etc/passwd

复制代码

以上启动docker后,会直接执行cat /etc/passwd.

dockerfile 中有ENTRYPOINT ["cat"] 和 CMD ["/etc/passwd"] ,启动docker

docker run -itd --name docker_name docker_image

复制代码

以上启动docker后,会直接执行cat /etc/passwd.

如果在启动命令后在加入其他参数

docker run -itd --name docker_name docker_image cat /etc/shadow

复制代码

实际会执行: cat /etc/passwd cat /etc/shadow .这样就是错误的

示例讲解

Dockerfile

FROM hub.geovis.io/isphere/ubuntu:18.04_ali ##基础镜像

RUN mkdir -p /opt/app/ \ ##容器中创建 /opt/app和/nfs/data两个文件夹

mkdir -p /nfs/data/ \

WORKDIR /opt/app/ ## 切换到/opt/app下,一下命令会在/opt/app下执行

COPY requirements.txt /opt/app ## 将本地的requirements.txt文档拷贝到容器的/opt/app下

RUN \

pip3 install -r requirements.txt ## 执行命令,安装依赖包

COPY . /opt/app/ ## 将本地其他相关文件拷贝到容器/opt/app下

EXPOSE 5000 ## 容器申请端口5000

ENTRYPOINT ["python3"]

CMD ["-m", "swagger_server"] ##docker run时,会直接执行 python3 -m swagger_server

复制代码

本地目录结构

4db05bbce422097526c45407bd9c2f28.png

打包命令

在Dockerfile的目录下执行

docker build -t dockerimage:tag .

复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值