Dockerfile
使用
创建镜像的时候,要在Dockerfile
所在的目录使用docker build
命令
sudo docker build --tag example
sudo docker build --tag <用户名>/example
--tag
或-t
选项用于设计镜像名称,将镜像上传到Docker Hub,只需要在/
之前添加用户名即可。
Dockerfile
的书写规则及指令使用方法
Dockerfile
的指令是忽略大小写的,建议使用大写,使用#
作为注释。每一行只支持一条指令,每条指令可以携带多个参数。
Dockerfile
的指令根据作用可以分为两种,构建指令和设置指令。
- 构建指令用于构建
image
,其指定的操作不会在运行image
的容器上执行。 - 设置指令用于设置
image
的属性,其指定的操作将在运行image
的容器中执行。
Dockerfile
关键字
1、FROM(指定基础镜像)
构建指令,Docker中必须使用FROM
命令,必须指定且需要在Dockerfile
其他指令的前面。后续的指令都依赖于该指令指定的image
。FROM指令指定的基础image
可以是官方远程仓库中的,也可以位于本地仓库。
该指令有两种格式:
-
FROM <镜像> 指定基础镜像为该镜像的最后修改的版本。
FROM ubuntu
-
FROM <镜像>:<标签> 指定基础镜像为该镜像的一个标签版本。
FROM ubuntu:15.10
一个Dockerfile
中可以使用多个FROM
命令,若设置了两个FROM
命令,则创建两个镜像。若使用--tag
选项设置了镜像名称,则会应用于最后一个FROM
命令。
2、MAINTAINER(指定镜像创建者信息)
构建指令,用于将image
的制作者相关的信息写入到image
中,一般输入名字和电子邮箱即可。当我们对该image
执行docker inspect
命令时,输出中有相应的字段记录该信息。
格式:
MAINTAINER <创建者信息>
MAINTAINER HUi20,<123456789@163.com>
3、RUN(安装软件用)
构建指令,在FROM
中设置的镜像上运行脚本或命令,在RUN
可以运行任何被基础image
支持的命令。如基础image
选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。
该指令有两种格式:
-
RUN <命令>使用shell运行命令
RUN git clone https://github.com/docker/docker.git
-
RUN ["<可执行文件>", “<形式参数1>”, “<形式参数2>” … ] 无shell直接运行
RUN ["/user/local/bin/hello","--help"]
4、CMD(设置container启动时执行的操作)
设置指令,用于容器启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。
一个Dockerfile
中只能有一条CMD
命令,多条则只执行最后一条CMD
.
该指令有三种格式:
CMD ["<可执行文件>","<形式参数1>","<形式参数2>""]
无shell
直接运行时设置形式参数CMD <命令> <形式参数1>,<形式参数2>
用shell
运行命令CMD ["<形式参数1>","<形式参数2>"]
当Dockerfile
指定了ENTRYPOINT
。
ENTRYPOINT
指定的是一个可执行的脚本或者程序的路径,该指定的脚本或者程序将会以param1
和param2
作为参数执行。所以如果CMD
指令使用上面的形式,那么Dockerfile
中必须要有配套的ENTRYPOINT
。
5、ENTRYPOINT(设置container启动时执行的操作)
设置指令,指定容器启动时执行的命令。
但是一个Dockerfile
中只能有一条ENTRYPOINT
命令,可以多次设置,但是只有最后一个有效。
两种格式:
ENTRYPOINT <命令> 参数1 参数2
用shell
运行命令ENTRYPOINT ["<可执行文件>", "<形式参数1>", "<形式参数2>"]
无shell
直接运行
ENTRYPONIT
可以在docker run
命令中使用 -- entrypoint
选项进行设置。若设置了--entrypoint
选项,则忽略Dockerfile
文件中的ENTRYPONIT
6、EXPOSE(指定容器需要映射到宿主机器的端口)
设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。
格式:
EXPOSE <端口号>
EXPOSE
只用于与主机进行连接,并不对外暴露。若想讲端口号暴露在外,需要使用docker run
命令的-p
、-P
选项
8、ENV(用于设置环境变量)
构建指令,在image
中设置一个环境变量。
格式:
# 使用环境变量时,要添加$符号
ENV <环境变量> <值>
设置了后,后续的RUN
命令都可以使用,container
启动后,可以通过docker inspect
查看这个环境变量。
也可以通过在docker run --e <环境变量>=<值>
时设置或修改环境变量。
9、ADD(向镜像添加文件)
构建指令,所有拷贝到container
中的文件和文件夹权限为0755,uid
和gid
为0。
格式:
ADD <要复制文件的路径> <文件在镜像中的路径>
src要复制文件的路径
dest文件在镜像中的路径
注意:
<src>
以上下文目录为基准,不能使用上下文以外的文件、目录或绝对路径<src>
可以是Dockerfile
所在目录的一个相对路径,也可以是一个URL,还可以是一个tar文件(自动解压为目录)- 如果
<src>
是文件且<dest>
中不使用斜杠结束,则会将<dest>
视为文件,<src>
的内容会写入<dest>
- 如果
<src>
是文件且<dest>
中使用斜杠结束,则会<src>
文件拷贝到<dest>
目录下 <dest>
是容器中的绝对路径- 如果是一个目录,那么会将该目录下的所有文件添加到
container
中,不包括目录 - 如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式)
ADD
只有在build
镜像的时候运行一次,后面运行container
的时候不会再重新加载了。
10、COPY(向镜像添加文件)
复制本地主机的 <src>
(为Dockerfile
所在目录的相对路径)到容器中的 <dest>
使用COPY添加文件时,不会解压缩,也不能使用文件URL
从上面的定义中可获知,src可以是Dockerfile
所在目录的一个相对路径,但在实际操作中,只有与Dockerfile
文件在同一目录的文件或目录可以成功的使用ADD <src> <dest>
如果文件或目录不与Dockerfile
在同一目录会提示no such file or directory
,如:(ADD ../test2 /data/code/nginx
),从Dockerfile
所在目录通过 cd ../test2
可以到达test2
格式:
COPY <要复制文件的路径> <文件在镜像中的路径>
src要复制文件的路径
dest文件在镜像中的路径
注意
<src>
以上下文目录为基准,不能使用上下文以外的文件、目录或绝对路径<src>
不仅可以设置为文件,还可以设置为目录。设置为目录时,会复制目录下的所有文件。另外,也可以使用通配符只复制特定文件<src>
不可以设置为网络文件的URL- 压缩文件不会解压缩,直接复制
<dest>
必须设置为绝对路径。并且,若路径以/结尾,则创建目录并将文件复制到该目录- 添加当前目录时,
.dockerignore
文件中设置的文件与目录会被排除在外
11、VOLUME(指定挂载点))
设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile
中使用该指令。可以将本地文件夹或者其他container
的文件夹挂载到container
中。
格式:
VOLUME ["<容器目录1>","<容器目录2>"]
VOLUME <容器目录>
使用VOLUME
不能与主机的特定目录进行连接
若想连接数据卷与主机的特定目录,则必须在docker run
命令中使用-v
选项。
选项格式为:-v <主机目录>:<容器目录>
12、USER(设置container容器的用户)
设置指令,设置启动容器的用户,默认是root
用户。该用户会应用于RUN
、CMD
、ENTRYPOINT
格式:
USER<账号用户名>
USER
后面的所有RUN
、CMD
、ENTRYPOINT
都会得到应用,中间可以设置其他用户以更换用户
13、WORKDIR(切换目录)
切换目录用,设置指令,可以多次切换(相当于cd
命令),对RUN
,CMD
,ENTRYPOINT
生效。
格式:
WORKDIR <路径>
设置WORKDIR
时也可以用相对路径替代绝对路径。若使用相对路径,先要以设置的WORKDIR
路径为基准更改目录。最初基准为/
14、ONBUILD(在子镜像中执行)
ONBUILD
指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
格式:
ONBUILD <Dockerfile命令><Dockerfile命令的形式参数>
需要再次创建example
镜像后,使用docker run
命令才会执行ONBUILD
设置的指令
转载自:DockerFile关键字介绍