dockerfile的结构和写法

in docker with 0 comment

Dockerfile 包含创建镜像所需要的全部指令。基于在 Dockerfile 中的指令,我们可以使用 Docker build 命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。
Dockerfile 支持支持的语法命令如下:

INSTRUCTION argument

指令不区分大小写。但是,命名约定为全部大写。
所有 Dockerfile 都必须以 FROM 命令开始。FROM 命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像(注:CentOS 和 Ubuntu 有些命令可是不一样的)。FROM 命令可以多次使用,表示会创建多个镜像。具体语法如下:

FROM <image name>
例如:    FROM ubuntu

上面的指定告诉我们,新的镜像将基于 Ubuntu 的镜像来构建。
继 FROM 命令,DockefFile 还提供了一些其它的命令以实现自动化。在文本文件或 Dockerfile 文件中这些命令的顺序就是它们被执行的顺序。

MAINTAINER:设置该镜像的作者。语法如下:

MAINTAINER <author name>

RUN:在 shell 或者 exec 的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。语法如下:

RUN 《command》

ADD:复制文件指令。它有两个参数和。destination 是容器内的路径。source 可以是 URL 或者是启动配置上下文中的一个文件。语法如下:

ADD 《src》 《destination》

CMD:提供了容器默认的执行命令。 Dockerfile 只允许使用一次 CMD 指令。 使用多个 CMD 会抵消之前所有的指令,只有最后一个指令生效。 CMD 有三种形式:

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

EXPOSE:指定容器在运行时监听的端口。语法如下:

EXPOSE <port>;

ENTRYPOINT:配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。语法如下:

ENTRYPOINT ["executable", "param1","param2"]
ENTRYPOINT command param1 param2

WORKDIR:指定RUN、CMD与ENTRYPOINT命令的工作目录。语法如下:

WORKDIR /path/to/workdir

ENV:设置环境变量。它们使用键值对,增加运行程序的灵活性。语法如下:

ENV <key> <value>

USER:镜像正在运行时设置一个 UID。语法如下:

USER <uid>

VOLUME:授权访问从容器内到主机上的目录。语法如下:

VOLUME ["/data"]

example:

    
#FROM 指令指定基础镜像
#比较常用的基础镜像有ubuntu,centos。这里使用了一个极小的基础镜像alpine
FROM alpine:latest

#MAINTAINER指令用于将镜像制作者相关的信息写入到镜像中
#您可以将您的信息填入name以及email
MAINTAINER name <email>

#RUN指令可以运行任何被基础image支持的命令,就像在操作系统上直接执行命令一样(如果使用ubuntu为基础镜像,这里应该用apt-get 命令安装)
#安装nginx
RUN apk --update add nginx

#配置Nginx,并设置在标准输出流输出日志(这样执行容器时才会看到日志)
RUN sed -i "s#root   html;#root   /usr/share/nginx/html;#g" /etc/nginx/nginx.conf

#Nginx日志输出到文件
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

#COPY指令复制主机的文件到镜像中 (在这里当前路径就是repo根目录)
#将2048项目的所有文件加入到Nginx静态资源目录里
COPY . /usr/share/nginx/html

#EXPOSE:指定容器监听的端口
EXPOSE 80

#CMD指令,容器启动时执行的命令
#启动Nginx并使其保持在前台运行
#CMD一般是保持运行的前台命令,命令退出时容器也会退出
CMD ["nginx", "-g", "pid /tmp/nginx.pid; daemon off;"]
Responses