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

posted @ 2021-01-21 18:15  michealyangblog  阅读(62)  评论(0编辑  收藏  举报