zoukankan      html  css  js  c++  java
  • Dockerfile常用语法

    1、FROM

    FROM scratch #制作base image
    FROM centos #使用base image
    FROM ubuntu:14.04
    为了安全尽量使用官方的image作为base image!

    2、LABEL

    LABEL maintainer="michealyang@qq.com"
    LABEL version="1.0"
    LABEL description="this is description"
    Metadata不可少!

    3、RUN

    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
    RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'
    为了美观,复杂的RUN请用反斜线换行!避免无用分层,合并多条命令成一行!

    4、WORKDIR

    WORKDIR /root
    WORKDIR /test #如果没有会自动创建test目录
    WORKDIR demo
    RUN pwd #输出的结果应该是/test/demo
    用WORKDIR,不要使用RUN cd!尽量使用绝对目录!

    5、ADD and COPY

    ADD hello /
    ADD test.tar.gz / #添加到根目录并解压
    WORKDIR /root
    ADD hello test/ #/root/test/hello
    WORKDIR /root
    COPY hello test/
    大部分情况,COPY优于ADD!ADD除了COPY还有额外功能(解压)!添加远程文件/目录请使用curl或者wget!

    6、ENV

    ENV MYSQL_VERSION 5.6 #设置常量
    RUN apt-get install -y mysql-server="${MYSQL_VERSION}"
        && rm -rf /var/lib/apt/lists/* #引用常量
    尽量使用ENV增加可维护性

    7、RUN vs CMD vs 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/echo","hello docker"]
      Dockerfile1
        FROM centos
        ENV name Docker
        ENTRYPOINT echo "hello $name" #运行镜像之后打印出hello Docker
      Dockerfile2
        FROM centos
        ENV name Docker
        ENTRYPOINT ["/bin/echo","hello $name"] #运行镜像之后打印出hello $name
        ENTRYPOINT ["/bin/bash","-c","echo hello $name"] #运行镜像之后打印出hello Docker
    CMD
      容器启动时默认执行的命令
      如果docker run指定了其他命令,CMD命令被忽略
      如果定义了多个CMD,只有最后一个会执行
      例如下面的Dockerfile:
      FROM centos
      ENV name Docker
      CMD echo "hello $name"
      运行docker run [image]会输出hello Docker
      运行docker run -it [image] /bin/bash则不输出
    ENTRYPOINT
      让容器以应用程序或者服务的形式运行
      不会被忽略,一定会执行
      最佳实践:写一个shell脚本作为entrypoint
      例如:
      COPY docker-entrypoint.sh /usr/local/bin
      ENTRYPOINT ["docker-entrypoint.sh"]
      EXPOSE 27017
      CMD ["mongod"]
      例如下面的Dockerfile:
      FROM centos
      ENV name Docker
      ENTRYPOINT echo "hello $name"
      运行docker run [image]会输出hello Docker
      运行docker run -it [image] /bin/bash也会输出hello Docker

  • 相关阅读:
    51Nod 1016 水仙花数 V2(组合数学,枚举打表法)
    April Fools Contest 2017 题解&源码(A,数学 B,数学 C,数学 D,字符串 E,数字逻辑 F,排序,卡时间,G,数学)
    统计0到n之间1的个数[数学,动态规划dp](经典,详解)
    hihoCoder #1082 : 然而沼跃鱼早就看穿了一切(字符串处理)
    洛谷 P1876 开灯(思维,枚举,规律题)
    Codeforces 789A Anastasia and pebbles(数学,思维题)
    51Nod 1182 完美字符串(字符串处理 贪心 Facebook Hacker Cup选拔)
    机器学习(Machine Learning)&深度学习(Deep Learning)资料
    看一下你在中国属于哪个阶层?
    python读取mnist
  • 原文地址:https://www.cnblogs.com/michealyang/p/14309558.html
Copyright © 2011-2022 走看看