加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

编写Dockerfiles的优秀实践

发布时间:2019-09-17 23:26:17 所属栏目:建站 来源:架构师之路
导读:本文档介绍了构建高效镜像的优秀实践和方法。 Docker通过从Dockerfile(按顺序包含构建给定镜像所需的所有命令的文本文件)读取命令来自动构建镜像。Dockerfile遵循特定的格式和一组命令,您可以在Dockerfile reference中找到这些命令。 Docker镜像由只读层

例如,Postgres官方镜像使用以下脚本作为其入口点:

  1. #!/bin/bash 
  2. set -e 
  3. if [ "$1" = 'postgres' ]; then 
  4. chown -R postgres "$PGDATA" 
  5. if [ -z "$(ls -A "$PGDATA")" ]; then 
  6. gosu postgres initdb 
  7. fi 
  8. exec gosu postgres "$@" 
  9. fi 
  10. exec "$@" 

注:

设置应用的PID为1,这样,PG会结构linux的任何信号。

helper脚本被复制到容器中,并在容器开始时通过ENTRYPOINT运行:

  1. COPY ./docker-entrypoint.sh / 
  2. ENTRYPOINT ["/docker-entrypoint.sh"] 
  3. CMD ["postgres"] 

这个脚本允许用户以多种方式与Postgres交互。

它可以简单地启动Postgres:

  1. $ docker run postgres 

或者,它可以用来运行Postgres并将参数传递给服务器:

  1. $ docker run postgres postgres –help 

最后,它也可以用来启动一个完全不同的工具,如Bash:

  1. $ docker run --rm -it postgres bash 

VOLUME

卷指令应该用于公开由docker容器创建的任何数据库存储区域、配置存储或文件/文件夹。强烈建议对镜像的任何可变和或用户可服务的部分使用VOLUME。

USER

如果服务可以在没有特权的情况下运行,请使用USER将其更改为非root用户。首先在Dockerfile中创建用户和组,使用类似于RUN groupadd -r postgres && useradd——no-log-init -r -g postgres postgres的东西。

镜像中的用户和组被分配一个不确定的UID/GID,因为"下一个"UID/GID被分配,而不考虑镜像的重建。因此,如果它是必须要使用的,您应该分配一个显式的UID/GID。

由于Go archive/tar包在处理稀疏文件时存在一个未解决的bug,试图在Docker容器中创建一个UID非常大的用户可能会导致磁盘耗尽,因为容器层中的/var/log/faillog中填充了NULL()字符。一个解决方案是将——no-log-init标志传递给useradd。Debian/Ubuntu adduser包装器不支持这个标志。

避免安装或使用sudo,因为它具有不可预知的TTY和信号转发行为,可能会导致问题。如果您绝对需要类似于sudo的功能,比如将守护进程初始化为根进程,但以非根进程的形式运行它,那么可以考虑使用"gosu"。

最后,为了减少层次和复杂性,避免频繁地来回切换用户。

WORKER

为了清晰和可靠,您应该始终为您的WORKDIR使用绝对路径。此外,您应该使用WORKDIR,而不是像RUN cd…&& do-something这样的指令,这些指令很难阅读、排除故障和维护。

ONBUILD

ONBUILD命令在当前Dockerfile构建完成后执行。ONBUILD在从当前镜像派生的任何子镜像中执行。将ONBUILD命令看作是父Dockerfile给子Dockerfile的一条指令。

Docker构建在子Dockerfile中的任何命令之前执行ONBUILD命令。

ONBUILD对于将从给定镜像构建的镜像非常有用。例如,您可以对一个语言堆栈镜像使用ONBUILD,该镜像可以在Dockerfile中构建用该语言编写的任意用户软件,正如您可以在Ruby的ONBUILD变体中看到的那样。

使用ONBUILD构建的镜像应该有一个单独的标记,例如:ruby:1.9-onbuild或ruby:2.0-onbuild。

在ONBUILD中添加或复制时要小心。如果新构建的上下文缺少正在添加的资源,则"onbuild"镜像将灾难性地失败。如上面建议的那样,添加一个单独的标记,通过允许Dockerfile作者做出选择,可以帮助缓解这种情况。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读