【Docker】Dockerfile指令

来源:互联网 发布:python机器人编程书籍 编辑:程序博客网 时间:2024/05/18 05:12

Dockerfile的全部指令清单可以到Dockerfile reference访问

FROM

每个Dockerfile的第一条指令必须是FROM

FROM指令指定一个已经存在的镜像,后续指令都将基于该镜像进行,这个镜像被称为基础镜像(base image)

FROM <image> [AS <name>]或者FROM <image>[:<tag>] [AS <name>]或者FROM <image>[@<digest>] [AS <name>]

MAINTAINER

MAINTAINER指令会设置该镜像的作者

MAINTAINER <name>

RUN

RUN指令会在当前镜像中运行指定的命令

RUN <command>

默认情况下,RUN指令会在Linux的shell里使用命令包装器/bin/sh -c来执行,或者Windows的cmd /S /C

如果是在一个不支持shell的平台上运行或者不希望在shell中运行(比如避免shell字符串篡改),也可以使用exec格式的RUN指令

RUN ["executable", "param1", "param2"]

在shell中,可以使用\来将指令分开写在不同行上

RUN /bin/bash -c 'source $HOME/.bashrc; \echo $HOME'

和这条指令等价

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

如果要使用不同的shell,可以使用exec格式的RUN指令

RUN ["/bin/bash", "-c", "echo hello"]

exec格式的命令会被解析为JSON格式的数据,所以只能只用双引号,不能使用单引号

EXPORT

EXPORT指令告诉Docker该容器内的应用将会使用容器的指定端口

EXPOSE <port> [<port>...]

CMD

CMD指令用于指定一个容器启动时要运行的命令,主要有三种格式

exec格式的CMD是优选的

CMD ["executable","param1","param2"]

作为ENTRYPOINT的默认参数

CMD ["param1","param2"]

shell格式

CMD command param1 param2

Dockerfile里只能有一条CMD命令,如果有多条,那么只有最后一条CMD命令会起作用

使用docker run命令可以覆盖CMD指令

ENTRYPOINT

docker run命令中的任何参数都会被当作参数再次传递给ENTRYPOINT指令中指定的命令,主要有两种格式

exec格式是优选的

ENTRYPOINT ["executable", "param1", "param2"]

shell格式

ENTRYPOINT command param1 param2

可以使用CMD和ENTRYPOINT指令来使镜像运行一个默认的命令,同时也支持通过docker run命令指定可覆盖的选项或者标志

FROM ubuntuENTRYPOINT ["top", "-b"]CMD ["-c"]

WORKDIR

WORKDIR指令用来从镜像创建一个新容器时,在容器内部设置一个工作目录,RUN,CMD,ENTRYPOINT,COPY和ADD指令会在这个目录下执行

WORKDIR /path/to/workdir

可以通过-w标志在运行时覆盖工作目录

sudo docker run -it -w /var/log ubuntu

ENV

ENV指令用来在镜像构建过程中设置环境变量

ENV <key> <value>ENV <key>=<value> ...

这个新的环境变量可以在后续的任何RUN指令中使用

也可以使用-e标志来传递环境变量,这些变量将只会在运行时有效

sudo docker run -it -e "WEB_PORT=8080" ubuntu

USER

USER指令用来指定该镜像会以什么样的用户去运行

USER <user>[:<group>]或者USER <UID>[:<GID>]

如果不通过USER指令指定用户,默认用户为root

VOLUME

VOLUME指令用来向镜像创建的容器添加卷

VOLUME ["/data","/opt/project"]

ADD

ADD指令用来将构建环境下的文件和目录复制到镜像中

指向源文件的位置参数可以是一个URL,或者构建上下文或环境中的文件名或目录

如果目的位置不存在,Docker会创建这个全路径

ADD <src>... <dest>

如果要在路径中包含空格

ADD ["<src>",... "<dest>"]

在ADD文件时,Docker通过目的地址参数末尾的字符来判断文件源是目录还是文件。如果目标地址以/结尾,那么指向的是一个目录。否则就是文件

如果将一个归档文件(gzip、bzip2、xz)指定为源文件,Docker会自动将归档文件解开(unpack)

ADD latest.tar.gz /var/www/wordpress/

COPY

COPY指令非常类似于ADD,它们的不同在于COPY只关心构建上下文中复制本地文件,而不会做文件提取(extraction)和解压(decompression)的工作

COPY <src>... <dest>

如果要在路径中包含空格

COPY ["<src>",... "<dest>"]

文件源路劲必须是一个与当前构建环境相对的文件或者目录,本地文件都放在和Dockerfile同一个目录下

COPY指令的目的位置必须是容器内部的一个绝对路径

LABEL

LABEL指令用于为Docker镜像添加元数据。元数据以键值对的形式展现

LABEL <key>=<value> <key>=<value> <key>=<value> ...

STOPSIGNAL

STOPSIGNAL指令用来设置停止容器时发送什么系统调用信号给容器,这个信号必须是内核系统调用表中合法的数

STOPSIGNAL signal

ARG

ARG指令用来定义可以在docker build命令运行时传递给构建运行时的变量

ARG <name>[=<default value>]

可以在构建时使用--build-arg标志即可

ONBUILD

ONBUILD指令能为镜像添加触发器(trigger)

ONBUILD [INSTRUCTION]

触发器会在构建过程中插入新指令,可以认为这些指令是紧跟在FROM之后指定的,触发器可以是任何构建指令

原创粉丝点击