Dockerfile是一个文本格式的配置文件,可以使用在命令行中调用任何命令。用户可以使用Dockerfile快速创建自定义的镜像
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的
a.使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。
docker build -t runoob/ubuntu:v1 .
Dockerfile 文件在/tmp目录下,生成的镜像名为 my/first_image
docker build -t my/first_image /tmp
b.使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。
docker build github.com/creack/docker-firefox
c.也可以通过 -f Dockerfile 文件的位置
docker build -f /path/to/a/Dockerfile
基本命令:
1.支持使用# 注释
2.第一行必须制定基于的基础镜像
FROM 镜像名
如果在同一个Dockerfile中创建多个镜像,可以使用多个FROM(每个镜像一次)
FROM microsoft/aspnetcore:2.0
维护者信息(可不写)
MAINTAINER: 维护者信息
示例:
MAINTAINER Jasper Xu
MAINTAINER sorex@163.com
MAINTAINER Jasper Xu <sorex@163.com>
3.RUN:构建镜像时执行的命令.其有以下两种命令执行方式:
shell执行
格式:
RUN <command>
如/bin/sh -C
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN apk update
RUN ["/bin/sh ", "-C", "echo hello"]
每条指令将在当前镜像基础上执行指令命令,并提交为新的镜像。当命令较长时候可以使用来换行
注:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参
数,如:docker build --no-cache
4.ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
ADD <src> <dest>
该命令将复制指定的<src>到容器的<dest>
其中<src>可以是Dockerfile所在目录的一个相对路径,也可以是一个URL,还可以是一个tar文件。
ADD ./bonree_agent/ /bonree_agent
5.COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
COPY <src> <dest>
复制本地主机的 <src>(为Dockerfile所在目录的相对路径,文件或者目录)为容器的<dest>。当目标路径不存在时会自动
创建。
如:ADD ./bonree_agent/ /bonree_agent
当使用本地目录为源目录时,推荐COPY。
6.CMD:构建容器后调用,也就是在容器启动时才进行调用。
支持三种格式:
CMD ["excutable","param1","param2"]使用exec执行,推荐方式。
CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用。
CMD ["param1","param2"]提供给ENTRYPOINT的默认参数
指定启动容器时每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条生效。
7.ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
有两种格式:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1 param2 (shell中执行)
配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。
每个Dockerfile只能有一条ENTRYPOINT命令,如果指定了多条,只有最后一条生效。
8.ENV:设置环境变量
ENV <key> <value>指定一个环境变量,会被RUN指令使用,并在容器运行时保持。
例如:
ENV CORECLR_ENABLE_PROFILING 1
9.EXPOSE:指定于外界交互的端口
EXPOSE <port> [<port>....]
EXPOSE 22 80 8443
告诉docker服务端容器暴露的端口号,供互联网系统使用。在启动容器的时候需要通过-P,docker主机会自动分配
一个端口转发到指定端口。使用-p,则可以具备指定哪个本地端口映射过来。
10、VOLUME:用于指定持久化目录 一般用来存放数据库或者需要保持的数据等
格式:VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
11.WORKDIR:工作目录,类似于cd命令
格式:WORKDIR /path/workdir
为后续的RUN CMD ENTRYPOINT指令配置工作目录
可以使用多个WORKDIR指令。后续的命令如果是相对路径,则会基于之前的命令指定的路径
WORKDIR /a
WORKDIR b
最终路径为/a/b
12.USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID
,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
USER daemon
例如:RUN groupadd -r postgres && useradd -r -g postgres
要临时获取管理员权限可以使用gosu 不推荐sudo
13.ONBUILD:用于设置镜像触发器
ONBUILD [INSTRUCTION]
当该镜像别其他镜像当做基础镜像时触发此命令。
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
相当于在后面添加了两条指令。
具体一个demo: