7.docker file 语法

详细文档 : https://docs.docker.com/engine/reference/builder/

1. FROM   尽量使用官方的 image 作为 base image

  FROM scratch  # 制作base image

  FROM centos   # 使用base image

  eg : FROM centos

2. LABEL    Metadata 不可少  类似与代码内的注释

  LABEL maintainer="zonehoo@163.com"

  LABEL version="1.0"

  LABEL description="This is description"

3.RUN  为了美观,复杂的RUN请用反斜线换行!避免无用分层,合并多条命令成一行!(反斜线为换行)

  在 centos 内安装软件  

  RUN yum update && yum install -y vim \

    python-dev

  在 ubantu 内安装软件

  RUN apt-get update && apt-get install -y perl \

    pwgen --no-install-recommends && rm -rf \

    /var/lib/apt/lists/*  #注意清楚cache

  RUN /bin/bash -c 'source $HOME/.bashc;echo $HOME'

4.WORKDIR  用WORKDIR, 不要用RUN cd,尽量使用绝对目录(设定当前工作目录 类似于 cd)

  1.WORKDIR /root

  2.  

    WORKDIR /test #若果没有会自动创建test目录

    WORKDIR demo

    RUN pwd      #输出结果应该是 /test/demo

5.ADD 和 COPY  (把本地的文件添加到image里面)

  大部分情况下,COPY 优于 ADD

  ADD 除了 COPY 还有额外功能(解压)

  添加远程文件/目录请使用curl或者wget

    ADD hello /      #将当前文件夹下的可执行文件 添加到 根目录里

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

    WORKDIR /root

    ADD hello test/     # hello 所在文件 /root/test/hello

    WORKDIR /root

    COPY hello test/  

6. ENV 通过设定一个环境变量 声明一个常量  (尽量使用ENV增加可维护性)

  ENV MYSQL_VERSION 5.6  #设定常量

  RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \

     && rm -rf /var/lib/apt/lists/*  #引用常量

7. RUN  与 CMD  与 ENTRYPOINT

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

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

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

   Shell 和 Exec 格式

   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"]

    ENTRYPOINT ["bin/echi", "hello docker"]

  测试 docker 的两种格式

    shell 格式   ENTRYPOINT 会连贯执行

      FROM centos

      ENV name DOCKER

      ENTRYPOINT echo "hello $name"    # hello DOCKER

    exec格式 ENTRYPOINT 会单独执行 命令 不与其他关联 若要解析要使用 /bin/bash 执行

      FROM centos

      ENV name Docker

      ENTRYPOINT ["/bin/echo", "hello $name"]  #hello $name

      改

      ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]  #hello Docker

   CMD 

    1.容器启动时默认执行的命令

    2.如果docker run指定了其他命令,CMD命令会被忽略

    eg: docker run -it [image_name] /bin/bash 则 CMD 命令会忽略

    3.如果定义了多个CMD,只有最后一个会执行

    eg:

      FROM centos

      ENV name Docker

      CMD echo "hello $name"    # hello Docker 

  ENTEYPOINT

    1.让容器以应用程序或则服务的形式运行 (一半作为一个后台的进程)

    2.不会被忽略,一定会执行

    eg: docker run -it [image_name] /bin/bash 会执行 Entrypoint 后的语句

    3.最佳实践:写一个shell脚本作为entrypoint

    COPY docker-entrypoint.sh /usr/local/bin/    #复制脚本到 指定目录

    ENTRYPOINT ["docker-entrypoint.sh"]  # 运行 entrypoint

    EXPOSE 27017

    CMD ["mongod"]

    

    

posted @ 2019-08-01 10:38  zonehoo  阅读(317)  评论(0编辑  收藏  举报