首页IT技术系统 › 写Dockerfiles的最佳实践

写Dockerfiles的最佳实践

注:根据官方文档https://docs.docker.com给出的最佳实践。官方文档的docker基础命令见http://wiki.too2.net/doku.php里的云计算-docker.

1.容器必须是短生命周期的。

随时可被停止、废除,被一个配置更改很小的新容器替换

2.使用 .dockerignore 文件

具体见:https://docs.docker.com/engine/reference/builder/#dockerignore-file

3.避免安装不必要的软件包

4.每一容器只运行一个进程

这样可以更多的复用。如果一个服务依赖于另一服务,可用links

https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/

5.尽量用最少数量的层

在易读和用最少层间做平衡折中。

6.跨行参数排列

可以用空格加\来写

7.编译缓存

默认情况是开启的,在已有的image中找看是否有一致的。

不使用缓存:在docker build 加–no-cache=true

 

Dockerfile 指示符有:FROM  MAINTAINER  RUN  CMD  LABEL  EXPOSE  ENV  ADD  COPY  ENTRYPOINT  VOLUME  USER  WORKDIR  ARG  ONBUILD  STOPSIGNAL  HEALTHCHECK  SHELL 

 

一个Dockerfile只能有一条CMD语句,否则只有最后一条有效

一个Dockerfile只能有一条HEALTHCHECK语句,否则只有最后一条有效

 

 

FROM

尽量使用官方仓库的镜你作为基础镜像

RUN

将长、复杂的RUN语句用反斜杠分割成多行

apt-get

RUN中最常用的。避免用RUN apt-get upgradedist-upgrade.

如果知道指定的包需要更新,那么直接apt-get install -y something

合并RUN apt-get upgradeapt-install在同一RUN语句中,比如:

RUN apt-get update && apt-get install -y \

package-bar \

package-baz

  && rm -rf /var/lib/apt/lists/*

 

RUN语句中单独使用apt-get update 将会导致缓存问题,使用之后的apt-get install失败。

CMD

用于在镜像包含软件的运行

运行格式为 CMD ["executable", "param1", "param2…],比如:

CMD ["apache2","-DFOREGROUND"]

EXPOSE

EXPOSE指示链接容器监听端口,应该用常用端口。

ENV

更新环境变量,比如:

ENV PATH /usr/local/nginx/bin:$PATH

将使用 语句 CMD['nginx']可以直接使用

ENV还可用于设置版本数字,比如

ENV PG_VERSION 9.3

ADDCOPY

两者作用差不多,更推荐COPY,因为更透明。

COPY只支持从本地复制文件到容器,而ADD有一些其它的(比如tar 解压以及远程URL支持)比如ADD rootfs.tar.xz /

因为镜像大小的原因,强烈建议不要使用ADD从远程URL获取安装包,而是用curlwget代替。通过这种方式可以在之后不再需要用时删除文件(比如解压缩后的原文件)

ENTRYPOINT

最佳使用方法是用于设置镜像的主命令,允许镜像被运行时像是被命令被执行一样。(使用CMD作为默认标识)

比如:

ENTRYPOINT ["s3cmd"]

CMD ["–help"]

那么就可以用docker run s3cmd来显示帮助信息了

也可以是脚本,比如:

COPY ./docker-entrypoint.sh /

ENTRYPOINT ["/docker-entrypoint.sh"]

VOLUME

可用于向外暴露容器的数据、配置、文件、文件夹

USER

如果服务不是用特权模式运行,使用USER切换到非root用户,需要在Dockerfile上先创建用户:

RUN groupadd -r postgres && useradd -r -g postgres postgres.

但时避免在容器里运行sudo,如果需要,那就干脆不要用USER了,直接用root运行。

WORKDIR

使用绝对路径,并且使用WORKDIR来代替RUN cd … && do-something

ONBUILD

一条ONBUILD命令将在本Dockerfile编译完全执行。用于给下一个Dockerfile(Dockerfile)指示

原文出自: http://blog.too2.net/?p=306
转载请注明转自:辛碌力成【http://blog.too2.net】

发表评论