Alpine镜像
,因为它只有5mb
LABEL
为了更好地组织镜像,最好使用容易理解的LABEL内容,并且值都用双引号(”),多个键值对应该放在同一行,如下:
1 2 3 4 5 6
LABEL vendor=ACME\ Incorporated \ com.example.is-beta= \ com.example.is-production="" \ com.example.version="0.0.1-beta" \ com.example.release-date="2015-02-12"
为了提高可读性,应该使用续行符(
\
)将命令分成多行。并且避免运行如
apt-get upgrade
或
dist-upgrade
等命令来升级整个系统,记得删除临时文件。
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
RUN apt-get update && apt-get install -y \ aufs-tools \ automake \ build-essential \ curl \ dpkg-sig \ libcap-dev \ libsqlite3-dev \ mercurial \ reprepro \ ruby1.9.1 \ ruby1.9.1-dev \ s3cmd=1.1.* \ && rm -rf /var/lib/apt/lists/*
因为Ubuntu和Debian官方镜像会自动运行
apt-get clean
,所以不需要再在命令中添加。
RUN中使用管道符要注意
由于Docker只关注最好一个命令执行是否正确,所以当管道前面错误时,后面依然可能成功,所以应该设置
set -o pipefail &&
来使执行过程中任何产生的错误都失败。
如下:
1
RUN ["/bin/bash" , "-c" , "set -o pipefail && wget -O - https://some.site | wc -l > /number" ]
通过将CMD指令用于交互模式,如
CMD ["python"]
,
docker run -it python
将会进入python的交互环境。除非你很了解CMD与ENTRYPOINT协同工作的方式,否则不要与ENTRYPOINT一起使用。
EXPOSE
指定容器的监听端口时,尽量使用通用的端口,如Apache web服务器的
EXPOSE 80
。
该指令通常用于应用程序提供必要的环境变量和版本号等设置:
1 2 3 4
ENV PG_MAJOR 9.3 ENV PG_VERSION 9.3 .4 RUN curl -SL http://example.com/postgres-$PG_VERSION .tar.xz | tar -xJC /usr/src/postgress && … ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD or COPY
推荐能用
COPY
的地方就用它,而不是
ADD
不需要保存压缩包的情况下尽量使用管道替代:
1 2 3 4
RUN mkdir -p /usr/src/things \ && curl -SL http://example.com/big.tar.xz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things all
ENTRYPOINT
其与
CMD
一起使用时可以使镜像像命令一样运行:
1 2
ENTRYPOINT ["s3cmd" ] CMD ["--help" ]
运行命令:
也可以覆盖其默认命令:
1
docker run s3cmd ls s3://mybucket
其也可以与脚本结合,让脚本成为其命令,组成更强大的功能。
VOLUME
VOLUME 指令应该用于如下内容:任何类型的数据库存储区域、配置存储、容器创建的文件或目录。
推荐 VOLUME 用于挂载镜像中那些经常变化(易变化的)或者用户可维护的部分。
如果不需要root权限,可以通过USER切换成非root用户,在Dockerfile中如下方式创建:
1
RUN groupadd -r postgres && useradd --no-log-init -r -g postgres postgres
尽量避免安装和使用 sudo,如果一定要使用类似 sudo 功能,可以使用 gosu 替代它,为了减少层数和复杂度,避免频繁使用 USER 进行用户切换。
WORKDIR
为了清楚可靠,应该使用绝对路径作为
WORKDIR
,而不是增加指令,如
RUN cd ..
ONBUILD
ONBUILD 指令在当前 Dockerfile 构建完成后执行,存储到镜像 的manifest 清单中,我们可以通过 docker inspect 查看 OnBuild 的信息。
当我们使用带有 ONBUILD 触发器的镜像作为基础镜像来创建新镜像时,当 Dockerfile 执行到 FROM 时会自动查找 OnBuild 信息并执行这个触发器命令。成功后继续向下执行下一条指令,失败的话就停止向下执行并中止创建过程。如果成功创建了新的镜像后,这个新镜像中不会继承基础镜像中的 ONBUILD 触发器内容。
建立的带有 ONBUILD 的镜像时应该有一个单独的标签,例如:ruby:1.9-onbuild 或 ruby:2.0-onbuild。
当把 ADD 或 COPY 加入 ONBUILD 中时要小心,如果新创建镜像的上下文缺少这些要添加的资源时,会导致创建镜像失败。因而添加单独的标签可以帮助我们减小这种情况发生的可能, 让 Dockerfile 作者来做决定。
Dockerfile reference
Best practices for writing Dockerfiles
其他大量互联网资料