最近在看Docker 技术入门与实践
, 在此做个笔记.
然后
大! 家! 中! 秋! 快! 乐!
Dockerfile指令
指令 | 说明 |
---|---|
FROM | 指定创建镜像的基础镜像 |
MAINTAINER | 指定维护者信息 |
RUN | 运行命令 |
CMD | 指定启动容器时默认执行的命令 |
LABEL | 指定生成镜像的元数据标签信息 |
EXPOSE | 声明镜像内服务所监听的端口 |
ENV | 指定环境变量 |
ADD | 复制指定的 <src> 路径下的内容到容器的 <dest> 路径下, src 可以为URL;如果为tar文件, 会自动解压到 <dest> 路径下 |
COPY | 复制本地主机的 <src> 路径下的内容到镜像中的<dest> 路径下;一般情况下推荐使用COPY, 而不是ADD |
ENTRYPOINT | 指定镜像的默认入口 |
VOLUME | 创建数据卷挂载点 |
USER | 指定运行容器时的用户或UID |
WORKDIR | 配置工作目录 |
ARG | 指定镜像内使用的参数(例如版本号信息等) |
ONBUILD | 配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令 |
STOPSIGNAL | 容器退出的信号值 |
HEALTHCHECK | 如何进行健康检查 |
SHELL | 指定使用shell时的默认shell类型 |
Demo
FROM
指定所创建镜像的基础镜像, 如果本地不存在, 则默认会去Docker Hub下载指定的镜像.
格式为FROM<image>
, 或FROM<image>:<tag>
, 或FROM<image>@<digest>
.
任何Dockerfile中的第一条指令必须为FROM指令. 并且, 如果同一个Dockerfile中创建多个镜像, 可以使用多个FROM指令(每个镜像一次).
MAINTAINER
指定维护者信息, 格式为MAINTAINER<name>
.
例如: MAINTAINER image_creator@docker.com
该信息会写入生成镜像的Author属性域中.
RUN
运行指定的命令.
格式为RUN<cmmand>
或 RUN ["executable", "param1", "param2"]
. 注意, 后一个指令会被解析为Json数组, 因此必须用双引号.
前者默认将在shell终端中运行命令, 即 /bin/sh -c
; 后者则使用exec
执行, 不会启动shell环境.
指定使用其他终端类型可以通过第二种方式实现.例如 RUN ["/bin/bash", "-c", "echo hello"]
.
每条RUN
指令将在当前镜像的基础上执行指定命令, 并提交为新的镜像. 当命令较长时可以使用 \
来换行. 例如:
RUN apt-get update \
&& apt-get install -y libsnappy-dev zliblg-dev libbz2-dev \
&& rm -rf /var/cache/apt
CMD
CMD
指令用来指定启动容器时默认执行的命令. 它支持三种格式:
-
CMD ["executable", "param1", "param2"]
使用exec执行, 是推荐使用的方式; -
CMD command param1 param2
在/bin/sh
中执行, 提供给需要交互的应用; -
CMD ["param1", "param2"]
提供给ENTRYPOINT
的默认参数
每个Dockerfile只能有一条CMD命令, 如果指定了多条命令, 只有最后一条会被执行.
如果用户启动容器时手动指定了运行的命令(作为run的参数), 则会覆盖掉CMD指定的命令.
LABEL
LABEL
指令用来指定生成镜像的元数据标签信息
格式为 LABEL <key>=<value> <key>=<value> <key>=<value> ....
例如:
LABEL version="1.0"
LABEL description="This text illustrates \ that label-values can span multiple lines."
EXPOSE
声明镜像内服务所监听的端口.
格式为EXPOSE <port> [<port>...]
.
例如:
EXPOSE 22 80 8443
注意, 该指令只是起到声明作用, 并不会自动完成端口映射.
在启动容器时需要使用 -P
, Docker主机会自动分配一个宿主机的临时端口转发到指定的端口; 使用-p
, 则可以具体指定哪个宿主机的本地端口会映射过来.
ENV
指定环境变量, 在镜像生成过程中会被后续```RUN``指令使用, 在镜像启动的容器中也会存在.
格式为 ENV<key><value> 或 ENV<key>=<value>
.
例如:
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
指令指定的环境变量在运行时可以被覆盖掉, 如 docker run -env <key>=<value> built_image
ADD
该命令将复制指定的<src>
路径下的内容到容器中的<dest>
路径下.
格式为ADD<src> <dest>
其中<src>
可以时 Dockerfile
所在目录的一个相对路径(文件或目录), 也可以是一个URL
, 还可以是一个 tar
文件(如果为tar
文件,会自动解压到<dest>
路径下). <dest>
可以是镜像内的绝对路径, 或者相对于工作目录(WORKDIR
)的相对路径.
路径支持正则格式, 例如:
ADD *.c /code/
COPY ### `
格式为COPY <src> <dest>
.
复制本地主机的 <src>
(为Dockerfile所在目录的相对路径, 文件或目录)下的内容到镜像中的<dest>
下. 目标路径不存在时, 会自动创建.
路径同样支持正则格式.
当使用本地目录作为源目录时, 推荐使用COPY
ENTRYPOINT
指定镜像的默认入口命令, 该入口命令会在启动容器时作为根命令执行, 所有传入值作为该命令的参数.
支持两种格式:
ENTRYPOINT ["executable", "param1", "param2"] (exec调用执行)
ENTRYPOINT command param1 param2(shell中执行)
此时, CMD
指令指定值将作为根命令的参数
每个Dockerfile
中只能有一个ENTRYPOINT
, 当指定多个时, 只有最后一个有效.
在运行时, 可以被--entrypoint
参数覆盖掉, 如docker run --entrypoint
.
VOLUME
创建一个数据卷挂载点.
格式为VOLUME ["/data"]
可以从本地主机或其他容器挂载数据卷, 一般用来存放数据库和需要包存的数据等.
USER
指定运行容器时的用户名或UID, 后续的RUN
等指令椰辉使用指定的用户身份.
格式为 USER daemon
当服务不需要管理员权限时, 可以通过该命令指定运行用户, 并且可以在之前创建所需要的用户.例如:
RUN groupadd -r postgres && useradd -r -g postgres postgres
要临时获取管理员权限可以使用 gosu
或 sudo
.
WORKDIR
为后续的 RUN
, CMD
和ENTRYPOINT
指令配置工作目录.
格式为 WORKDIR /path/to/workdir
.
可以使用多个WORKDIR
指令, 后续命令如果参数是相对路径, 则会基于之前命令指定的路径; 例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为/a/b/c
.
ARG
指定一些镜像内使用的参数(例如版本号信息等), 这些参数在执行docker build
命令时才以 --build-arg<varname>=<value>
格式传入.
格式为 ARG<name>[=<default value>]
.
则可以用docker build --build-arg<name>=<value> .
来指定参数值.
ONBUILD
配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令.
格式为ONBUILD [INSTRUCTRION]
.
例如, Dockerfile
使用如下的内容创建了镜像image-A
:
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果基于image-A
创建新的镜像时, 新的 Dockerfile
中使用FROM image-A
指定基础镜像, 会自动执行ONBUILD
指令的内容, 等价于在后面添加了两条指令:
FROM image-A
# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用ONBUILD
指令的镜像, 推荐在标签中注明, 例如 ruby:1.9-onbuild
.
STOPSIGNAL
指定所创建镜像启动的容器接受退出的信号值. 例如:
STOPSIGNAL signal
HEALTHCHECK
配置所启动容器如何进行健康检查(如何判断健康与否), 自Docker 1.12开始支持.
格式有两种:
-
HEALTHCHECK [OPTIONS] CMD command
: 根据所执行命令返回值是否为0来判断; -
HEALTHCHECK NONE
: 禁止基础镜像中的健康检查
OPTION
支持:
-
--interval=DURATION
(默认为: 30s): 过多久检查一次; -
--time=DURATION
(默认为: 30s): 每次检查等待结果的超时; -
--retries=N
(默认为: 3): 如果失败了, 重试几次才最终确定失败.
SHELL
指定其他命令使用shell
时的默认shell
类型.
SHELL ["executable", "parameters"]
默认值为["bin/sh", "-c"]
.
注意: 对于Windows系统, 建议在Dockerfile 开头添加 # escape=`来指定转义信息
参考书籍: Docker技术入门与实践
本文由 anybbo 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Dec 17,2020