Docker学习--Dockerfile介绍

904 阅读4分钟

一、基本结构

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

  一般Dockerfile分为四部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

# This dockerfile uses the ubuntu image# VERSION 2 - EDITION 1# Author: docker_user# Command format: Instruction [arguments / command] ..# Base image to use, this must be set as the first lineFROM ubuntu# Maintainer: docker_user <docker_user at email.com> (@docker_user)MAINTAINER docker_user docker_user@email.com# Commands to update the imageRUN echo 'deb http://archive.ubuntu.com/ubuntu/ raring main universe' >> /etc/apt/sources.listRUN apt-get update && apt-get install -y nginxRUN echo '\ndaemon off;' >> /etc/nginx/nginx.conf# Commands when creating a new containerCMD /usr/sbin/nginx

  其中,

  • 开头必须指明基于的镜像信息
  • 然后推荐说明维护者信息
  • 接下来使镜像操作指令,如RUN指令,每运行一条RUN指令,镜像添加新的一层并提交
  • 最后是CMD指令,来指定运行容器时的操作指令


二、指令

  指令包括FROMMAINTAINERRUN等,一般格式为<INSTRUCTION> <arguments>

1、FROM指令

  格式:FROM <image>FROM <image>:<tag>

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

2、MAINTAINER指令

  格式:MAINTAINER <name>

  用于指定维护者信息

3、RUN指令

  格式:RUN <command>RUN ['executable', 'param1', 'param2']

  前者是在shell终端中运行命令,即/bin/sh -c,后者使用exec执行,当需指定其他终端可以通过第二种方式实现,例如RUN ['/bin/bash', '-c', 'echo hello']

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

4、CMD指令

  格式:

  • CMD ['executable', 'param1', 'param2']:使用exec执行,推荐方式
  • CMD command param1 param2:在/bin/sh中执行,提供给需要交互的应用
  • CMD ['param1', 'param2']:提供给ENTRYPOINT的默认参数

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

5、EXPOSE指令

  格式:EXPOSE <port> [<port>...]

  暴露Docker服务端容器的端口号,在启动容器时需要通过-P自动分配一个端口转发到指定的端口。

6、ENV指令

  格式:ENV <key> <value>

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

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJZ /usr/src/postgres && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

7、ADD指令

  格式:ADD <src> <dest>

  复制指定的<src>到容器中的<dest><src>可以是Dockerfile所在目录的一个相对路径,也可以是一个URL,也可以是一个tar文件。

8、COPY指令

  格式:COPY <src> <dest>

  复制本地主机的<src>到容器中的<dest>

9、ENTRYPOINT指令

  格式:

  • ENTRYPOINT ['executable', 'param1', 'param2']
  • ENTRYPOINT command param1 param2(在shell执行)

  配置容器启动后指定的命令,且不可被docker run提供的参数覆盖。每个Dockerfiel中只能有一个ENTRYPOINT指令,多个时最后一个生效。

10、VOLUME指令

  格式:VOLUME ['/data']

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

11、USER指令

  格式:USER daemon

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

  可以在使用前创建需要的用户:

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

  然后通过USER命令指定运行的用户,要临时获取管理员权限时可以使用gosu,而不推荐sudo

12、WORKDIR指令

  格式:WORKDIR /path/to/workdir

  为后续的RUNCMDENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令中指定的相对路径,如:

WORKDIR /a
WORKDIR b
WORKDIR c

  则对应的路径为/a/b/c

13、ONBUILD指令

  格式:ONBUILD [INSTRUCTION]

  配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。例如,Dockerfile中包含了以下内容创建了镜像imageA

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

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

FROM imageA

# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

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


三、创建镜像

  可以使用docker build命令来创建镜像

docker build [options] <path>

  该命令将读取<path>路径(包括子目录)下的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像;还可以通过.dockerignore文件来让Docker忽略路径下的目录和文件。

  要指定镜像的标签信息,可以使用-t参数:

docker build -t myrepo/myapp /tmp/test1