dockerfile命令解释

FROM: 用于选择底层image,尽量使用官方的image作为base image

FROM scratch //制作base image
FROM centos:7 //使用base image
FROM ubuntu:14.04
LABEL: 定义了image的meta data, 需要写一些关于image的注释信息

LABEL maintainer="[email protected]"
LABEL version="1.0"
LABEL description="This is description!"
RUN: 每运行一次'"RUN"对image来说都会生成新的一层,为了避免无用的分层,需要将多条命令合并为一行,为了美观,复杂的"RUN"可以用反斜线换行.

RUN yum update && yum install -y vim
python-dev //使用反斜线换行

RUN apt-get update && apt-get intall -y perl
pwgen --no-install-recommends && rm -rf
/var/lib/apt/lists/* //注意清理cache
RUN /bin/bash -c 'source HOME'
WORKDIR: 设定当前工作目录,即在设定的目录下做一些操作. 要使用WORKDIR,而不要使用"RUN cd",且尽量使用绝对目录

WORKDIR /root
WORKDIR /test //如果根目录下没有test目录,会自动创建testmul
WORKDIR demo
RUN pwd     //输出结果应该是/test/demo
ADD and COPY: 将本地的文件添加到image中,ADD不仅可以添加文件到指定目录,而且可以解压缩. 大部分情况下,COPY优于ADD,但ADD具有可以解压的额外性能.需要添加远程文件/目录时,需要使用curl或者wget.

ADD hello / //将可执行文件"hello"添加的根目录

ADD test.tar.gz / //添加到根目录并解压

WORKDIR /root
ADD hello test/ //添加到了/root/test/hello

WORKDIR /root
COPY hello test/

ENV: 通过设定一个环境变量生成一个常量,尽量使用ENV来提高开发的可维护性

ENV MYSQL_VERSION 5.6       //设置常量 MYSQL_VERSION=5.6
RUN apt-get install -y mysql-server="${MYSQL_VERSION}"
&& rm -rf /var/lib/apt/lists/* //引用常量
CMD and ENTRYPOINT

RUN: 执行命令并创建新的image layer

CMD: 设置容器启动后默认执行的命令和参数

ENTRYPOINT: 设置容器启动时执行的命令

Shell格式:

RUN apt-get install -y vim
CMD echo "hello,docker"
ENTRYPOINT echo "hello docker"
Exec格式:

RUN ["apt-get","install","-y","vim"]
CMD ["/bin/echo","hello docker"] //echo是/bin目录下的一个可执行文件
ENTRYPOINT ["/bin/echo","hello docker"]
使用Shell格式的RUN命令,会在shell里使用shell解释器 /bin/bash -c 来执行。但如果是在一个不支持shell的平台上或者不希望在shell中运行RUN命令是,可以使用Exec格式的RUN命令.在Exec格式中,通过bash解析命令的方法:

//执行一条shell命令
ENTRYPOINT ["/bin/bash","-c","echo $HOME"] //注:-c后的参数只能有一个

//直接执行 .sh脚本,sh脚本的第一行会指定脚本的解析器
ENTRYPOINT [XXX.sh]
CMD ENTRYPOINT
容器启动时默认执行的命令 让容器以应用程序或服务的形式运行
如果docker run指定了其他命令,CMD命令会被忽略 不会被忽略,一定会执行
如果定义了多个CMD,只有最后一个会被执行 通常用法:写一个shell脚本作为entrypoint
FROM centos:7
ENV name Docker
CMD echo "hello,$name"
执行docker run imagaID 结果会打印:hello,Docker

执行docker run -it imageID /bin/bash 结果直接进入container,因为run后指定的/bin/bash命令

FROM centos:7
ENV name Docker
ENTRYPOINT echo "hello,$name"
执行docker run imagaID 结果会打印:hello,Docker

执行docker run -it imageID /bin/bash 结果会打印:hello,Docker,但没有进入container的bash

你可能感兴趣的:(dockerfile命令解释)