8.1 基本结构

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

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


  1. # This Dockerfile uses the ubuntu image
  2. # VERSION 2 - EDITION 1
  3. # Author: docker_user
  4. # Command format: Instruction [arguments / command] ..
  5. # Base image to use, this must be set as the first line
  6. FROM ubuntu
  7. # Maintainer: docker_user <docker_user at email.com> (@docker_user)
  8. MAINTAINER docker_user docker_user@email.com
  9. # Commands to update the image
  10. RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/
  11. sources.list
  12. RUN apt-get update && apt-get install -y nginx
  13. RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
  14. # Commands when creating a new container
  15. CMD /usr/sbin/nginx

其中,一开始必须指明所基于的镜像名称,接下来一般是说明维护者信息。后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像就添加新的一层,并提交。最后是CMD指令,用来指定运行容器时的操作命令。

下面是Docker Hub上两个热门镜像的Dockerfile的例子,可以帮助读者对Dockerfile结构有个基本的认识。

第一个例子是在debian:jessie基础镜像基础上安装Nginx环境,从而创建一个新的nginx镜像:


  1. FROM debian:jessie
  2. MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"
  3. ENV NGINX_VERSION 1.10.1-1~jessie
  4. RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC64107
  5. 9A6ABABF5BD827BD9BF62 \
  6. && echo "deb http://nginx.org/packages/debian/ jessie nginx" >> /etc/
  7. apt/sources.list \
  8. && apt-get update \
  9. && apt-get install --no-install-recommends --no-install-suggests -y \
  10. ca-certificates \
  11. nginx=${NGINX_VERSION} \
  12. nginx-module-xslt \
  13. nginx-module-geoip \
  14. nginx-module-image-filter \
  15. nginx-module-perl \
  16. nginx-module-njs \
  17. gettext-base \
  18. && rm -rf /var/lib/apt/lists/*
  19. # forward request and error logs to docker log collector
  20. RUN ln -sf /dev/stdout /var/log/nginx/access.log \
  21. && ln -sf /dev/stderr /var/log/nginx/error.log
  22. EXPOSE 80 443
  23. CMD ["nginx", "-g", "daemon off;"]

第二个例子是基于buildpack-deps:jessie-scm基础镜像,安装Golang相关环境,制作一个GO语言的运行环境镜像:


  1. FROM buildpack-deps:jessie-scm
  2. # gcc for cgo
  3. RUN apt-get update && apt-get install -y --no-install-recommends \
  4. g++ \
  5. gcc \
  6. libc6-dev \
  7. make \
  8. && rm -rf /var/lib/apt/lists/*
  9. ENV GOLANG_VERSION 1.6.3
  10. ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
  11. ENV GOLANG_DOWNLOAD_SHA256 cdde5e08530c0579255d6153b08fdb3b8e47caabbe717bc7bcd
  12. 7561275a87aeb
  13. RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \
  14. && echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - \
  15. && tar -C /usr/local -xzf golang.tar.gz \
  16. && rm golang.tar.gz
  17. ENV GOPATH /go
  18. ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
  19. RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
  20. WORKDIR $GOPATH
  21. COPY go-wrapper /usr/local/bin/

下面将讲解Dockerfile中各种指令的应用。