Docker(五)Dockerfile语法

一、FROM

选择构建Docker image的base image。

FROM scratch # 制作base image
FROM centos # 使用centos image作为base image

二、LABEL

image的相关描述。

LABEL maintainer="[email protected]"
LABEL version="1.0"
LABEL description="This is description"

三、RUN

每执行一次RUN,image就会分层。为了避免无用分层,通过&&符号可以合并成一层。

RUN yum update && yum install -y vim \
    python-dev #反斜杠代表换行
RUN apt-get update && apt-get install -y perl \
    pwgen --no-install-recommends && rm -rf \
    /var/lib/apt/lists/* #注意清理cache

四、WORKDIR

设定当前工作目录,和cd命令相似。

WORKDIR /test # 如果没有会自动创建test目录
WORKDIR file
RUN pwd # 输出结果应该是/test/file

五、ADD、COPY

把本地文件添加到Docker image 里面

ADD myFile / # 把当前目录下的myFile文件拷贝到根目录下

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

WORKDIR /root
ADD myFile test/ # /root/test/myFile

ADD和COPY操作相似,大部分情况,COPY优于ADD!ADD除了拷贝还有额外功能(解压),添加远程文件、目录使用curl或wget!

六、ENV

设置常量,增加可维护性!

ENV MYSQL_VERSION 5.6
RUN apt-get install -y mysql-server = "${MTYSQL_VERSION}" \
    && rm -rf /var/lib/apt/lists/* # 引用变量

七、比较RUN、CMD、ENTRYPOINT

RUN:执行命令并创建新的image layer(镜像层)
CMD:设置容器启动后默认执行的命令和参数
ENTRYPOINT:设置容器启动时运行的命令

7.1 CMD

  • 容器启动时默认执行的命令
  • 如果docker run -it [image] /bin/bash指定了其他命令/bin/bash,则CMD命令会被忽略
  • 如果在Dockerfile中定义了多个CMD命令,只有最后一个会执行

Dockerfile文件:

FROM centos
ENV name Docker
CMD echo "hello $name"

7.2 ENTRYPOINT

  • 不会被忽略,一定会执行
  • 通常用法,写一个shell脚本作为entrypoint

Dockerfile文件:

COPY docker-entrypoint.sh /usr/local/bin
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOST 27017
CMD ["mongod"]

猜你喜欢

转载自blog.csdn.net/xsp_happyboy/article/details/80291308