编写Dockerfiles的优秀实践
例如,Postgres官方镜像使用以下脚本作为其入口点:
注: 设置应用的PID为1,这样,PG会结构linux的任何信号。 helper脚本被复制到容器中,并在容器开始时通过ENTRYPOINT运行:
这个脚本允许用户以多种方式与Postgres交互。 它可以简单地启动Postgres:
或者,它可以用来运行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作者做出选择,可以帮助缓解这种情况。
(编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |