Dockerfile常用命令

1,657 阅读1分钟

常用指令

FROM

基础镜像
例子:FROM centos:7

LABEL

描述信息
例子:LABEL verision=“1.0" author=“tbc"

MAINTAINER

维护者信息
例子:MAINTAINER tianbocheng <tianbocheng@teleinfo.cn>

RUN

执行命令,创建新的Image Layer
例子:RUN yum install -y vim && chmod +x /home/start.sh
建议多行命令使用”&&“和”\”放到一个RUN命令中,减少分层

WORKDIR

设定当前目录(如果没有会自动创建)
例子:WORKDIR /home/tbc
备注:
    建议使用绝对目录
    目录切换尽量使用WORKDIR,不建议使用RUN cd

ADD

添加文件到镜像中
例子:ADD test.tar.gz /home/tbc/
注意:除添加文件还会解压文件

COPY

添加文件到镜像中
例子:COPY run.sh /home/tbc/
备注:
    大部分情况优于ADD
    添加远程文件可以通过RUN curl或RUN wget

ARG

构建参数
例子:ARG VERSION=“1.0"
备注:与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效

ENV

设置环境变量
例子:
    ENV MYSQL_VERSION=5.7
    ENV myName John Doe
备注:
    可在Dockerfile中使用${MYSQL_VERSION}引用常量
    一次只能设置一个变量

CMD

设置容器启动时默认执行的命令和参数
例子:CMD echo “hello docker” 
备注:
    如果docker run指定了其他命令,CMD命令被忽略
    如果定义了多个CMD,只有最后一个会执行

ENTRYPOINT

设置容器启动时运行的命令
例子:ENTRYPOINT [“docker-entrypoint.sh"]
备注
    让容器以程序或者服务的形式运行
    不会被忽略,一定会运行
    最佳实践:写一个shell脚本作为entrypoint

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
例子:
    VOLUME [“/home", “/data”]   
    VOLUME /home
备注:
    避免容器不断变大
    避免重要的数据,因容器重启而丢失

EXPOSE

声明端口
例子:
    EXPOSE 80 443
    EXPOSE 3306
    EXPOSE 11211/tcp 11211/udp
备注:
    帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
    在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
例子:
    HEALTHCHECK --interval=5s --timeout=3s \ CMD curl -fs http://127.0.0.1:8080/ || exit 1
    HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

ONBUILD

延迟构建命令的执行
例子:
    ONBUILD ehco “tbc"
    ONBUILD ADD run.sh /home
备注:
    Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当
    当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

RUN,CMD,ENTRYPOINT常用格式

  • Shell(读取环境变量)
    • RUN apt-get install -y vim
    • CMD echo “hello $name” // 会将变量替换,,即打印出环境变量name的值
    • ENTRYPOINT echo “tbc"
  • Exec
    • RUN [“apt-get”, “install”, “-y”, “vim"]
    • CMD [“/bin/echo”, “hello $name”] // 不会将变量替换,即打印$name
    • ENTRYPOINT [“/bin/bash”, “-c”, “echo hello $name”] // 会将变量替换,即打印出环境变量name的值

常见样例

# Version 0.0.1
FROM centos:7

# 作者
MAINTAINER tianbocheng <tianbocheng@teleinfo.cn>

# LABEL version=“1.0” description=“二级-IDIS-注册服务”

# 环境变量
ENV NODE=5.7

# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 加入部署文件
ADD idis/ /home/

# 设置工作目录
WORKDIR /home

# 初始化
RUN echo "net.ipv4.tcp_tw_reuse=1" >> /etc/sysctl.conf

# 安装rpm包
RUN rpm -ivh *.rpm

# 获取执行权限
RUN chmod +x /home/DigestTool && chmod +x /home/start.sh && chmod +x /usr/local/idisapi/bin/runApi.sh

# 移除安装包
RUN rm -rf /home/*.rpm

# 镜像启动执行脚本
ENTRYPOINT ["/home/start.sh"]