8.1 基本结构
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 line
- FROM ubuntu
- # Maintainer: docker_user <docker_user at email.com> (@docker_user)
- MAINTAINER docker_user docker_user@email.com
- # Commands to update the image
- 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
- # Commands when creating a new container
- CMD /usr/sbin/nginx
其中,一开始必须指明所基于的镜像名称,接下来一般是说明维护者信息。后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像就添加新的一层,并提交。最后是CMD指令,用来指定运行容器时的操作命令。
下面是Docker Hub上两个热门镜像的Dockerfile的例子,可以帮助读者对Dockerfile结构有个基本的认识。
第一个例子是在debian:jessie基础镜像基础上安装Nginx环境,从而创建一个新的nginx镜像:
- FROM debian:jessie
- MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"
- ENV NGINX_VERSION 1.10.1-1~jessie
- RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC64107
- 9A6ABABF5BD827BD9BF62 \
- && echo "deb http://nginx.org/packages/debian/ jessie nginx" >> /etc/
- apt/sources.list \
- && apt-get update \
- && apt-get install --no-install-recommends --no-install-suggests -y \
- ca-certificates \
- nginx=${NGINX_VERSION} \
- nginx-module-xslt \
- nginx-module-geoip \
- nginx-module-image-filter \
- nginx-module-perl \
- nginx-module-njs \
- gettext-base \
- && rm -rf /var/lib/apt/lists/*
- # forward request and error logs to docker log collector
- RUN ln -sf /dev/stdout /var/log/nginx/access.log \
- && ln -sf /dev/stderr /var/log/nginx/error.log
- EXPOSE 80 443
- CMD ["nginx", "-g", "daemon off;"]
第二个例子是基于buildpack-deps:jessie-scm基础镜像,安装Golang相关环境,制作一个GO语言的运行环境镜像:
- FROM buildpack-deps:jessie-scm
- # gcc for cgo
- RUN apt-get update && apt-get install -y --no-install-recommends \
- g++ \
- gcc \
- libc6-dev \
- make \
- && rm -rf /var/lib/apt/lists/*
- ENV GOLANG_VERSION 1.6.3
- ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
- ENV GOLANG_DOWNLOAD_SHA256 cdde5e08530c0579255d6153b08fdb3b8e47caabbe717bc7bcd
- 7561275a87aeb
- RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \
- && echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - \
- && tar -C /usr/local -xzf golang.tar.gz \
- && rm golang.tar.gz
- ENV GOPATH /go
- ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
- RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
- WORKDIR $GOPATH
- COPY go-wrapper /usr/local/bin/
下面将讲解Dockerfile中各种指令的应用。
