Dockerfile

文章目录
  1. 1. 基本结构
  2. 2. 指令
    1. 2.1. FROM
    2. 2.2. MAINTAINER
    3. 2.3. RUN
    4. 2.4. CMD
    5. 2.5. EXPOSE
    6. 2.6. ENV
    7. 2.7. ADD
    8. 2.8. COPY
    9. 2.9. ENTRYPOINT
    10. 2.10. VOLUME
    11. 2.11. USER
    12. 2.12. WORKDIR
    13. 2.13. ONBUILD

Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。

基本结构

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。

一般Dockerfile文件分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author:docker_user
# Command format: Instruction [arguments / command] ..
# 第一行必须制定基于的基础镜像
FROM ubuntu
# 维护者信息
MAINTAINER docker_user docker_user@email.com
# 镜像的操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 容器启动时执行指令
CMD /usr/sbin/nginx

Dockerfile文件编写时,一开始必须指明所基于的镜像名称,接下来一般会说明维护者信息

后面则是镜像操作指令,例如RUN指令,镜像增加新的一层,并提交。最后是CMD指令,来指定运行容器时的操作命令。

以下有两个摘自书上的Dockerfile例子:

1
2
3
4
5
6
# Ngnix
#
# VERSION 0.0.1
FROM ubuntu
MAINTAINER Victor Vieux <victor@docker.com>
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server

此Dockerfile文件是在ubuntu父镜像基础上安装inotify-tools、nginx、apache2、openssh-server软件,从而创建一个新的Nginx镜像

:inotify-tools是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
# Firefox over VNC
#
# VERSION 0.3
FROM ubuntu
# Install vnc, xvfb in order to reate a 'fake' display and firefox
RUN apt-get update && apt-get install -y xllvnc xvfb firefox
RUN mkdir /.vnc
# Setup a password
RUN xllvnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'
EXPOSE 5900
CMD ["xllvnc", "-forever", "-usepw", "-create"]

此Dockerfile基于ubuntu父镜像,安装filefox和vnc软件,启动后,用户可以通过5900端口通过vnc方式使用firefox。

指令

指令的一般格式为INSTRUCTION arguments,指令包括FROM、MAINTAINER、RUN等。

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类型

FROM

1
格式为 FROM <image> 或FROM<image>:<tag>

第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。

MAINTAINER

1
格式为 MAINTAINER <name>, 指定维护者信息

RUN

1
格式为 RUN <command> 或 RUN ["executable", "param1", "param2"]

RUN 将在shell终端中运行命令,即 /bin/sh -c

RUN [“executable”, “param1”, “param2”]则使用exec执行。

指定使用其他终端可以通过第二种方式实现,例如 RUN [“/bin/bash”, “-c”, “echo hello”]。

每条RUN指令将在当前镜像基础上执行指令命令,并提交为新的镜像。当命令较长时可以用 \ 来换行。

CMD

支持三种格式

  • 使用exec执行,推荐方式

    1
    CMD ["executable", "param1", "param2"]
  • 在/bin/sh中执行,提供给需要交互的应用

    1
    CMD command param1 param2
  • 提供给ENTRYPOINT的默认参数

    1
    CMD ["param1", "param2"]

指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。

如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。

EXPOSE

1
格式为 EXPOSE <port> [<port>...]

例如:EXPOSE 22 80 8443

就是告诉Docker服务器容器暴露的端口号,供互联系统使用。在启动容器时需要通过-P或者-p来指定端口映射。

ENV

1
格式为 ENV <key> <value>

指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持。例如:

1
2
3
4
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

ADD

1
格式为 ADD <src> <dest>

该命令将复制指定的到容器中的。其中可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件(自动解压为目录)。

COPY

1
格式为 COPY <src> <dest>

复制本地主机的(为Dockerfile所在目录的相对路径,文件或目录)为容器中的。目标路径不存在时,会自动创建。

当使用本地目录为源目录时,推荐使用COPY

ENTRYPOINT

  • 使用exec执行,推荐方式

    1
    ENTRYPOINT ["executable", "param1", "param2"]
  • 在shell中执行

    1
    ENTRYPOINT command param1 param2

配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖

每个Dockerfile中只能有一个ENTRYPOINT,当制定多个ENTRYPOINT时,只有最后一个生效。

VOLUME

1
格式为 VOLUME ["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

USER

1
格式为 USER daemon

指定运行容器时的用户名或UID,后续的RUN也会使用指定的用户。

当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:

1
RUN groupadd -r postgres && useradd -r -g postgres postgres

要临时获取管理员权限可以使用gosu,不推荐sudo

WORKDIR

1
格式为 WORKDIR /path/to/workdir

为后续RUN、CMD、ENTRYPOINT指令配置工作目录。

可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如:

1
2
3
4
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

上面指令最终结果为:/a/b/c

ONBUILD

1
格式为 ONBUILD [INSTRUCTION]

配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。例如:

1
2
3
4
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

Dockerfile使用上面的内容创建了镜像image-A,如果基于image-A创建新的镜像时,新的Dockerfile中使用FROM image-A指定基础镜像时,会自动执行ONBUILD指令内容,等价于在Dockerfile后面添加了两条指令,如:

1
2
3
4
FROM image-A
# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的镜像,推荐在标签中注明,例如ruby:1.9-onbuild。


关注我的微信公众号:FramePower
我会不定期发布相关技术积累,欢迎对技术有追求、志同道合的朋友加入,一起学习成长!


微信公众号

如果文章对你有帮助,欢迎点击上方按钮打赏作者