DockerFile 文件常用详解
FROM
:指定基础镜像,必须为第一个命令1
2
3
4
5
6
7
8格式:
<image>
<image>:<tag>
<image>@<digest>
示例:
centos:7.2.1511
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像MAINTAINER
:维护者信息1
2
3
4
5
6格式:
MAINTAINER <name>
示例:
MAINTAINER caijinkun
MAINTAINER caijinkun <caijinkun@mastercom.cn>
MAINTAINER caijinkun "caijinkun@mastercom.cn"RUN
:构建镜像时执行的命令1
2
3
4
5
6
7
8
9
10
11
12
13
14
15RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
RUN <command>
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
注:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
可以在构建时指定--no-cache参数,如:docker build --no-cache
每执行Run命令,都会创建一个中间镜像层,使得最终创建的镜像文件变大,建议把命令都在一个Run中执行,用&&分隔.ADD
:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget1
2
3
4
5
6
7
8
9
10格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
注:
该命令只能添加Dockerfile路径的下层文件,所以需要事先拷贝文件到该路径下COPY
:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源,建议直接用ADDCMD
:构建容器后调用,也就是在容器启动时才进行调用1
2
3
4
5
6
7
8
9
10格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
CMD ["java","-jar","mtex-config-0.0.1-SNAPSHOT.jar"]
注:
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令ENTRYPOINT
:配置容器,使其可执行化。配合CMD可省去”application”,只使用参数。1
2
3
4
5
6
7
8
9
10
11格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
注:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT
而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT
Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。ENV
:设置环境变量1
2
3
4
5
6
7格式:
ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffyEXPOSE
:指定于外界交互的端口1
2
3
4
5
6
7
8
9
10格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注:
EXPOSE并不会让容器的端口访问到主机。要使其可访问
需要在docker run 运行容器时通过 -p 来发布这些端口
或通过 -P 参数来发布EXPOSE导出的所有端口VOLUME
:用于指定持久化目录1
2
3
4
5
6
7
8
9
10
11
12格式:
VOLUME ["path"]
示例:
VOLUME ["/data","/home"]
注:
和docker run -v 的区别是无法挂载指定的目录.
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1.卷可以容器间共享和重用
2.容器并不一定要和其它容器共享卷
3.修改卷后会立即生效
4.对卷的修改不会对镜像产生影响
5.卷会一直存在,直到没有任何容器在使用它WORKDIR
:工作目录,类似于cd命令1
2
3
4
5
6
7
8格式:
WORKDIR path
示例:
WORKDIR /home (这时工作目录为/home)
WORKDIR jenkins-running-jar (这时工作目录为/home/jenkins-running-jar)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
docker 执行DockerFile创建镜像
基础镜像
docker pull centos:7.2.1511
先从仓库中拉取一个centos7.2的系统,来作为最底层的镜像- 先下载 jre-8u201-linux-x64.tar.gz 下载地址 以此为基础创建一个具备java环境的基础镜像
- 这里使用jre而非jdk,主要是为了降低镜像大小。
- 这里注意需要引入镜像的文件必须与Dockerfile路径同级或下级
在jre-8u201-linux-x64.tar.gz文件路径下 vi Dockerfile
创建镜像,拷贝以下内容
1 | #使用的基础镜像 |
执行Dockfile文件 docker build -t java:jre1.8.0.201 .
并检查镜像创建是否成功docker images java
mtex-config镜像
基础镜像已经完毕,准备创建程序的DockerFile和程序,这里以mtex-config为例
1 | #使用的基础镜像 |
这里需要引入自身的配置文件夹,所以把压缩包引入镜像后先删除原配置文件夹.待使用docker启动时将自身配置文件挂载进去,也可以使用其他方式.
使用docker启动mtex-config,这里pro-properties是我自身的配置文件夹名称,这里挂载到主机的是linux自带的日志,可自行进行log日志挂载
1 | docker run --name mtex-config -tid --privileged=true --restart=always --net=host -v /home/jenkins-running-jar/mtex-config/pro-properties:/home/jenkins-running-jar/mtex-config/properties/ -v /home/file/nohupLog/mtex-config.log:/home/jenkins-running-jar/mtex-config/nohup.out mtex-config |
启动容器时把自身的配置文件夹挂载到容器中即可.--net=host
代表和主机使用同一个网段,即同一个IP和端口.
如果打算通过-p
进行端口映射,需要先在启宿主机的防火墙上开启该端口,并对外暴露.
mtex-sys镜像
程序镜像基本都类似,都是根据业务要求挂载不同的文件即可.
1 | #使用的基础镜像 |
docker启动mtex-sys实例:
1 | docker run --name mtex-sys -tid --privileged=true --restart=always --net=host -v /home/file/nohupLog/mtex-sys.log:/home/jenkins-running-jar/mtex-sys/nohup.out mtex-sys |
这时要注意,sys作为框架需要访问很多个项目的文件夹配置及路径,根据需求进行挂载,或者弄一个项目的共享文件夹即可.
最后更新: 2020年05月26日 17:39