Dockerfile 最佳实践

287 阅读1分钟

FROM

FROM scratch # 制作base image
FROM centos  # 使用base image
FROM ubuntu:14.14

为了安全尽量使用官方的image作为base image

LABEL

Metadata 不可少

LABEL maintainer="author@gmail.com"
LABEL version="1.0"
LABEL description="this is description"

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

每运行一次对于image都会生成新的一成,为了美观,复杂的run请用反斜线换行,避免无用分层,合并多条命令成一行

WORKDIR

设定当前工作目录,类似CD改变当前目录

 WORKDIR /root
 WORKDIR /test #如果没有会自动创建test目录 
 WORKDIR demo
 RUN pwd  #输出结果应该是/test/demo

用WORKDIR,不要使用RUN cd, 尽量使用绝对目录。

ADD and COPY

把本地的文件添加到docker image里面. add可以解压缩

 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

ENV

ENV MYSQL VERSION 5.6 #设置常量
RUN apt-get install-y mysql-server= "${MYSQLVERSION}" \
&&rm-rf /var/lib/apt/lists/* #引用常量

env具有可维护性,尽量使用env设置常量

ARG

构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

ARG APP_PATH=/var/www/app

CMD ENTRYPOINT

RUN :执行命令并创建新的Image Layer CMD:设置容器启动后默认执行的命令和参数 ENTRYPOINT :设置容器启动时运行的命令

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

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

CMD

  1. 容器启动时默认执行的命令
  2. 如果docker run指定了其他命令,CMD命令会被忽略
  3. 如果定义了多个CMD,只有最后一个会执行
FROM centos
ENV name Docker
CMD echo "hello $name"

docker run [image] //输出 hello Docker docker run-it [image] /bin/bash //没有输出

ENTRYPOINT

  1. 让容器以应用程序或者服务的形式运行
  2. 不会被忽略,一定会执行
  3. 最佳实践:写一个shel脚本作为entrypoint
COPY docker-entrypoint.sh /usr/local/bin/ 
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 27017
CMD ["mongod"]

reference

github.com/docker-libr…