FROM
指令和MAINTAINER
指令脚本的第1行是FROM
指令。经过FROM
指令,docker
编译程序可以知道在哪一个基础镜像执行来进行编译。全部的Dockerfile都必须以FROM
指令开始。第二条指令MAINTAINER
,用来标明这个镜像的维护者信息。python
RUN
指令接下来是RUN
指令。这条指令用来在docker
的编译环境中运行指定命令。上面这条指令会在编译环境运行/bin/sh -c "apt-get update && apt-get -y install ..."
。RUN
指令还有另一种格式:mysql
RUN ["程序名", "参数1", "参数2"]
复制代码
这种格式运行程序,能够免除运行/bin/sh
的消耗。这种格式使用Json格式将程序名与所需参数组成一个字符串数组,因此若是参数中有引号等特殊字符,须要进行转义。linux
ENV
指令ENV
指令用来指定在执行docker run
命令运行镜像时,自动设置的环境变量。这些环境变量能够经过docker run
命令的--evn
参数来进行修改。nginx
COPY
指令和ADD
指令COPY
指令用来将本地(Dockerfile所在位置)的文件或文件夹复制到编译环境的指定路径下。上面的例子里,boot2docker的Dockerfile但愿将与Dockerfile同一目录下的kernel_config
文件复制到编译环境的/linux-kernal/.config
。Dockerfile还提供了另一个相似的指令:ADD
。在复制文件方面ADD
指令和COPY
指令的格式和效果是彻底同样的。这两个指令的区别主要由两点:sql
ADD
指令能够从一个URL地址下载内容复制到容器的文件系统中;ADD
指令会将压缩打包格式的文件解开后复制到指定位置,而COPY
指令只作复制操做。CMD
指令这是整个Dockerfile脚本的最后一条指令。当Dockerfile已经完成了全部环境的安装与配置,经过CMD
指令来指示docker run
命令运行镜像时要执行的命令。上面的例子里,在完成全部工做后,boot2docker的编译脚本将编译结果输出到本地环境下。docker
上面咱们经过boot2docker的Dockerfile脚本学习了几个最经常使用的指令。接下来咱们再学习剩下的几个指令。数据库
EXPOSE
指令EXPOSE <端口> [<端口>...]
指令用于标明,这个镜像中的应用将会侦听某个端口,而且但愿能将这个端口映射到主机的网络界面上。可是,为了安全,docker run
命令若是没有带上响应的端口映射参数,docker
并不会将端口映射出了。ubuntu
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
的区别CMD ["cat","/etc/passwd"]
,启动dockerdocker run -itd --name docker_name docker_image
复制代码
以上启动docker后,会直接执行cat /etc/passwd
.和直接执行
docker run -itd --name docker_name docker_image cat /etc/passwd
复制代码
ENTRYPOINT ['cat']
,启动dockerdocker run -itd --name docker_name docker_image /etc/passwd
复制代码
以上启动docker后,会直接执行cat /etc/passwd
.
ENTRYPOINT ["cat"]
和 CMD ["/etc/passwd"]
,启动dockerdocker 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 .这样就是错误的
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
复制代码
在Dockerfile的目录下执行
docker build -t dockerimage:tag .
复制代码