Dockerfile

130 阅读3分钟

Dockerfile保留字

FROM

基础镜像,当前镜像是基于哪个镜像

FROM	centos:latest
MAINTAINER

镜像维护者的姓名和邮箱地址

MAINTAINER	zxpnnl@qq.com
RUN

容器构建时需要运行的命令

注意:每个指令都是独立运行的,并且会导致创建一个新映像,因此RUN cd /tmp不会对下一个指令产生任何影响。

RUN yum -y insall vim
EXPOSE

通知 Docker 容器在运行时侦听指定的网络端口。可以指定端口是监听TCP还是UDP,如果不指定协议,默认为TCP

EXPOSE 8080
EXPOSE <port> [<port>/<protocol>...]
WORKDIR

指定在创建容器后,终端默认登录的进来工作目录,一个落脚点

WORKDIR /usr/local
ENV

用来构建镜像时设置环境变量

ENV MYPATH="/usr/local"
ADD

ADD指令从中复制新文件、目录或远程文件 URL、 <src> ,并将它们添加到路径 处的图像文件系统中<dest>

每个<src>都可能包含通配符,匹配将使用 Go 的 filepath.Match规则完成。

如果<src>是可识别的压缩格式(identity、gzip、bzip2 或 xz)的本地tar 存档,则将其解压缩为目录。

ADD 遵守以下规则:

  • <src>路径必须是内部语境的构建; 你不能ADD ../something /something,因为 a 的第一步 docker build是将上下文目录(和子目录)发送到 docker 守护进程。
  • 如果<src>是 URL 并且<dest>不以斜杠结尾,则从 URL 下载文件并将其复制到<dest>.
  • 如果<src>是 URL 并且<dest>以斜杠结尾,则从 URL 推断文件名并将文件下载到 <dest>/<filename>. 例如,ADD http://example.com/foobar /将创建文件/foobar. URL 必须有一个重要的路径,以便在这种情况下可以发现适当的文件名(http://example.com 将不起作用)。
  • 如果<src>是目录,则复制目录的全部内容,包括文件系统元数据。
  • 如果<src>是任何其他类型的文件,则将其与其元数据一起单独复制。在这种情况下,如果<dest>以斜杠结尾/,它将被视为一个目录,其内容<src>将被写入<dest>/base(<src>)
  • 如果<src>直接指定了多个资源,或者由于使用了通配符,则<dest>必须是目录,并且必须以斜杠结尾/
  • 如果<dest>不以斜杠结尾,则将其视为常规文件,并将其内容<src>写入<dest>.
  • 如果<dest>不存在,则创建它及其路径中所有丢失的目录。

所有新文件和目录都使用 0 的 UID 和 GID 创建,除非可选--chown标志指定给定的用户名、组名或 UID/GID 组合以请求添加内容的特定所有权。

ADD有两种形式:
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
COPY

类似ADD,拷贝文件或目录到镜像中

将从构建上下文目录中<源路径>的文件或目录复制 到新的一层镜像内的<目标路径>位置

规则与ADD一样但是不会自动解压

COPY有两种形式:
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
VOLUME

容器数据卷

VOLUME 	["/volume1","/volume2"]
CMD

指定一个容器启动时要运行的命令

Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

CMD指令有三种形式:

  • CMD ["executable","param1","param2"]exec形式,这是首选形式)
  • CMD ["param1","param2"](作为ENTRYPOINT 的默认参数
  • CMD command param1 param2(shell形式)
CMD	 ["ls"]

例子:

docker run -it centos -i 会报错

docker run -it centos echo "hello" ls会失效

ENTRYPOINT

指定一个容器启动时要运行的命令

ENTRYPOINT的目的和CMD一样,只有最后一个生效,都是指定容器启动程序及参数

这允许将参数传递给入口点,即,docker run <image> -d 将-d参数传递给ENTRYPOINT。您可以ENTRYPOINT使用docker run --entrypoint 标志覆盖指令。

优选形式:ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT ["ls"]

例子:

docker run -it centos -i 不会报错

docker run -it centos echo "hello" ls会失效

注意:使用docker run --entrypoint 可以重写ENTRYPOINT指令

可以使用

ONBUILD