Dockerfile编写
# Dockerfile介绍
Dockerfile类似于一种脚本,用来告诉docker build命令在构建镜像时,应该执行哪些操作。一般用一个目录存放Dockerfile和其他构建需要用到的文件,例如:/nginx/Dockerfile。编写好后,可以使用docker build命令进行镜像构建。
# Dockerfile书写格式
# 注释
- Dockerfile中注释以
#
开头即可。
# FROM
FROM [image]:[tag]
或FROM [image]
- 指定基础镜像信息,我们相当于是在FROM指定的镜像之上进行构建。
# MAINTAINER
MAINTAINER [维护者信息]
- 例如:
MAINTAINER Jasper Xu <sorex@163.com>
# RUN
指定构建时执行的命令,它是基于FROM镜像之上执行的。
RUN [命令行命令]
- SHELL格式- 等同于在终端操作shell命令。
RUN ["可执行文件", "参数1", "参数2"]
- EXEC格式- 两者种方式没有太大区别,例如:
RUN ["./test.php", "dev", "offline"]
同等于RUN ./test.php dev offline
。
- 两者种方式没有太大区别,例如:
注意:
Dockerfile的指令每执行一次都会在 docker上新建一层,所以过多无意义的层,会造成镜像膨胀过大。
所以我们一般多条命令用"&&"符号连接命令,这样执行只会创建1层镜像。
例如:
RUN mkdir /test1 RUN touch /test1/txt RUN touch /test1/test2 以上执行会创建 3 层镜像,以下只会创建 1 层镜像: RUN mkdir /test1 \ && touch /test1/txt \ && touch /test1/test2
1
2
3
4
5
6
7
# COPY
复制指令,会从本机中复制文件或者目录,到容器中指定路径。
COPY [参数] [源文件] [目标路径]
--chown=[用户]:[组]
复制时改变文件属主属组。
- 注意:
- 源文件可指定多个
[源文件1],[源文件2]...
,且源文件可以使用通配符*?
。 - 目标路径不存在的话,会自动创建。
- 源文件可指定多个
# ADD
与COPY差不多,只不过源文件压缩格式为gzip、bzip2、xz时,会自动解压到目标路径。同样需求下,官方推荐使用COPY,我们在不需要解压时使用COPY,需要解压时使用ADD即可。
ADD [参数] [源文件] [目标路径]
# CMD
指定容器默认启动命令。
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
- 注意:
- CMD中的引号必须是双引号。
- CMD指定的命令可被docker run时指定的启动命令覆盖。
# ENV
定义环境变量,并且在后续的命令中,可以使用这个环境变量,通过$调用例如$TEST,且构建好后仍然存在。
ENV [key1]=[value1] [key2]=[value2]...
# ARG
与ENV作用一致,不过ARG设置的环境变量仅在构建过程中有效,构建好后不会存在。
ARG [key1]=[value1] [key2]=[value2]...
# VOLUME
用于指定持久化目录,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,匿名卷被docker隐藏存放在本地的未知路径。
VOLUME ["容器目标目录","容器目标目录"...]
# WORKDIR
切换工作目录,类似于cd命令,设置工作目录后,Dockerfile中其后的命令都会在该目录下执行。
WORKDIR [工作目录路径]
# USER
指定运行容器时的用户名或UID或GID,后续容器运行时也会使用指定用户,用户和用户组必须提前已经存在。
USER [用户名/用户ID]
USER [用户名/用户ID:用户组名/用户组ID]
- 注意:
- 通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
# EXPOSE
声明要暴露的端口,但并不映射,帮助镜像使用者理解这个镜像服务的端口,以方便配置映射。在容器运行命令如果指定-P参数,则会自动随机映射EXPOSE的端口。
EXPOSE <端口1> [<端口2>...]
# ONBUILD
用于延迟构建命令的执行,当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发。
ONBUILD [指令]...
- 例如:
ONBUILD RUN mkdir /test
# 例子
mkdir -p ./test/ && cd ./test && touch test.conf && vim Dockerfile
FROM ubuntu:latest
MAINTAINER Harmoniar <985816089@qq.com>
# 一个测试Dockerfile
ENV USERNAME=admin KEY=123456
COPY test.conf /data/config/
WORKDIR /data/
EXPOSE 80
RUN touch /data/test.txt && \
mkdir /data/lib && \
touch /data/lib/iamlib
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker build -t testimg:latest --force-rm .