Dockerfile 使用

Dockerfile 常用命令
命令 备注 是否必填
FROM 基础镜像 必填
ADD 拷贝文件到容器中(文件可以为 URL 链接) 不必填
COPY 拷贝文件到容器中(文件只能是本地文件) 不必填
WORKDIR 切换工作目录到指定目录 不必填
RUN 镜像构建时运行脚本命令 不必填
CMD 镜像构建后,启动容器时运行脚本命令 不必填
ENTRYPOINT 镜像构建后,启动容器时运行脚本命令 不必填
ONBUILE 在当前 Dockerfile 中不执行,在子镜像中会的 FROM 命令后执行 不必填
ENV 设置环境变量,容器启动后依然存在 不必填
ARG 设置变量参数,只在容器构建时存在 不必填
SHELL 执行 SHELL 脚本 不必填
MAINTAINER 维护人信息 不必填
LABEL key-value 形式标签,没有实质作用 不必填
EXPOSE 暴露容器内端口 不必填
USER RUN、CMD、ENTRYPOINT 执行 Shell 命令时指定用户,默认 root 不必填
VOLUME 挂在主机目录到容器 不必填
HEALTHCHECK 告诉 Docker 如何测试容器以检查它是否仍在工作,健康检查 不必填
命令示例
  • FROM

    # Dockerfile 基于 centos 为基础镜像构建
    FROM centos
  • MAINTAINER

    # 维护者信息
    MAINTAINER Raindrop <727474430@qq.com>
  • LABEL

    # 标签,一般可用来替代 MAINTAINER
    LABEL maintainer=Raindrop email=727474430@qq.com
  • ARG

    # 环境变量,构建镜像时有效
    ARG SERVICE_NAME Tomcat
    RUN echo $SERVICE_NAME
    # 可在构建时传入变量
    docker build -t --build-arg SERVICE_NAME=Weblogic .
  • ENV

    # 环境变量,容器启动后依然有效
    ENV JAVA_HOME /usr/local/jdk1.8
    RUN echo $JAVA_HOME
  • ADD

    # 拷贝文件到容器中,可拷贝网络资源
    ADD index.html /var/www/html
    ADD https://www.baidu.com/index.html /var/www/html
  • COPY

    # 拷贝文件到容器中,只能拷贝本地资源,不拷贝网络资源时,建议使用
    COPY index.html /var/www/html
    COPY app.jar /app
  • WORKDIR

    # 切入工作目录,类似 cd
    WORKDIR /app
    WORKDIR /tomcat
  • RUN

    # 构建镜像时执行的 shell
    RUN ["yum", "install", "httpd"]
    RUN yum install httpd
  • CMD

    # 启动容器时执行的 shell
    CMD ["-C", "/run.sh"]
    CMD ["/usr/sbin/sshd", "-D"]
    CMD /usr/sbin/sshd -D
  • ENTRYPOINT

    # 启动容器时执行的 shell,同 CMD 类似,只是由 ENTRYPOINT 启动的程序不会被 docker run 命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给 ENTRYPOINT 指定指定的程序
    ENTRYPOINT ["/bin/bash", "-C", "/start.sh"]
    ENTRYPOINT /bin/bash -C '/start.sh'
  • EXPOSE

    # 暴露端口
    EXPOSE 80 443
  • USER

    # RUN、CMD、ENTRYPOINT 执行 shell 命令指定用户,默认 root
    USER <user>[:<usergroup>]
    USER <UID>[:<UID>]
    USER weblogic:weblogic
  • VOLUME

    # 挂载容器目录之本地
    VOLUME ["/var/lib/mysql"]
    VOLUME /usr/lib/mysql /var/lib/mysql
  • ONBUILE

    # 子容器 FROM 后执行,通常用于构建基础镜像时预先添加内容,在子镜像中依赖,以减轻镜像容量
    FROM alpine
    ONBUILD ENV APP_NAME=Tomcat
    CMD echo $APP_NAME
    docker build -t test .
    ---
    # 若不指定 CMD 和 ENTRYPOINT 默认执行父镜像指令,若父镜像也没有 CMD 和 ENTRYPOINT 则报错
    FROM test
  • HEALTHCHECK

    # 健康检查
    HEALTHCHECK --interval=5m --timeout=3s --retries=3 \
        CMD curl -f http:/localhost/ || exit 1
    # 含义
    -- interval=DURATION (default: 30s):每隔多长时间探测一次,默认 30 秒
    -- timeout= DURATION (default: 30s):服务响应超时时长,默认 30 秒
    -- start-period= DURATION (default: 0s):服务启动多久后开始探测,默认 0 秒
    -- retries=N (default: 3):认为检测失败几次为宕机,默认 3 次
    # 一些返回值的说明:
    0:容器成功是健康的,随时可以使用
    1:不健康的容器无法正常工作
    2:保留不使用此退出代码 
Dockerfile 示例
  • 构建 centos 镜像

    # 基础镜像
    FROM centos
    # 维护人信息
    MAINTAINER Raindrop <727474430@qq.com>
    # 构建时运行命令
    RUN yum -y update && yum -y install httpd
    # 暴露 80 端口
    EXPOSE 80
    # 复制 index.html 到指定地址
    COPY index.html /var/www/html/index.html
    # 切换工作目录
    WORKDIR /var/www/html/index.html
    # 设置环境变量
    ENV SHELL_NAME="run.sh"
    # 复制该脚本至镜像中,并修改其权限
    ADD $SHELL_NAME /run.sh
    RUN chmod 775 /run.sh
    # 容器启动时执行脚本文件
    CMD ["/run.sh"]


docker     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!