Dockerfile详解

网友投稿 269 2022-10-18

Dockerfile详解

文章目录

​​一、构建材料​​

​​`run.sh`​​

​​二、完整示例​​​​三、指令详解​​

​​`FROM[必选]`​​​​`MAINTAINER[可选]`​​​​`LABEL[可选]`​​​​`EXPOSE[可选]`​​​​`ENV[可选]`​​

​​验证​​

​​`ADD[可选]`​​​​`COPY[可选]`​​​​`VOLUME[可选]`​​​​`USER[可选]`​​​​`WORKDIR[可选]`​​​​`ARG[可选]`​​​​`RUN[可选,但用的频率非常高]`​​​​`CMD与ENTRYPOINT至少有一个`​​

​​SHELL模式​​​​EXEC模式​​

​​`ENTRYPOINT`​​​​`ONBUILD[可选]`​​

​​四、构建镜像​​​​五、CMD与ENTRYPOINT在docker run时覆盖方法的不同处​​

​​`CMD的覆盖方式`​​​​`ENTRYPOINT覆盖方式`​​

​​六、注意事项​​

​​`减少镜像层`​​​​`避免使用ADD`​​​​`优化镜像大小:清理无用数据`​​​​`多阶段进行镜像构建`​​​​`COW写时复制技术决定不能在不同指令中操作同一目录`​​

​​参考文章:​​

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。

一、构建材料

​​run.sh​​

#!/bin/bashecho "Hello Docker"tail -f /dev/null

二、完整示例

FROM docker.io/nginxLABEL author="运维@小兵" version="1.0" describe="构建nginx镜像"ENV USERNAME nginxUSER ${USERNAME}EXPOSE 80 443WORKDIR /optVOLUME /dataADD jdk-8u191-linux-x64.tar.gz /optCOPY run.sh /tmpRUN echo "${USERNAME}" >> /tmp/test.txtCMD /tmp/run.sh

三、指令详解

​​FROM[必选]​​

用于指定构建镜像时依赖的基础镜像

格式:

FROM 或 FROM: #不填tag默认为latest

例如:FROM docker.io/nginx

​​MAINTAINER[可选]​​

镜像维护人的信息 MAINTAINER

示例:MAINTAINER 运维@小兵 邮箱地址

​​LABEL[可选]​​

指定该dockerfile的基本信息,如维护者、版本等

例如:LABEL author=“运维@小兵” version=“1.0” describe=“构建nginx镜像”

​​EXPOSE[可选]​​

例如:EXPOSE 80 443

告诉 Docker 服务,容器需要暴露的端口号

​​ENV[可选]​​

格式:

ENV 一次设置一个变量 ENV = = 设置多个环境变量

指定一个环境变量,会被后续 RUN 指令使用,在容器中通过export可以查看

例如:ENV USERNAME nginx

验证

通过RUN命令把USERNAME的值保存到/tmp/test.txt

RUN echo "${USERNAME}" >> /tmp/test.txt

​​ADD[可选]​​

​​COPY[可选]​​

与ADD类似,对于压缩文件,不会自动解压 run.sh脚本需提前准备好,放到与Dockerfile同级目录下

注意:不能直接拷贝目录,但可以拷贝目录下的内容

COPY config/ /config/ 把当前config目录下所有文件拷贝到/config/目录下

例如:COPY run.sh /home/

​​VOLUME[可选]​​

容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中。

为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。

当然,运行时可以覆盖这个挂载设置。比如:

docker run -d -v mydata:/data 镜像名

使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了 Dockerfile 中定义的匿名卷的挂载配置

VOLUME /var/data /var/log

指定容器中的/var/log挂载到宿主机的/var/data目录,等同于-v /var/data:/var/log

​​USER[可选]​​

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

例如:USER nginx

​​WORKDIR[可选]​​

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录

例如:WORKDIR /opt

​​ARG[可选]​​

设置构建镜像要传递的参数 ARG [=]

例如:ARG name=sss

​​RUN[可选,但用的频率非常高]​​

​​CMD与ENTRYPOINT至少有一个​​

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条 CMD 命令,只有最后一条会被执行。如果用户在启动容器时指定了要运行的命令,则会覆盖掉 CMD 指定的命令。

最常用的写法是执行一个启动服务的脚本

SHELL模式

CMD bash /home/run.sh

EXEC模式

CMD ["bash", "/home/run.sh"]

​​ENTRYPOINT​​

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个 ENTRYPOINT 时,只有最后一个生效。

可以在docker run时追加参数

例如:ENTRYPOINT /tmp/run.sh

​​ONBUILD[可选]​​

格式为:ONBUILD [INSTRUCTION] 配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。例如,Dockerfile 使用如下的内容创建了镜像 image-A。

…ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build –dir /app/src…

四、构建镜像

docker build -t nginx:1.0 .

五、CMD与ENTRYPOINT在docker run时覆盖方法的不同处

​​CMD的覆盖方式​​

docker run -itd nginx:latest sleep 3600

​​ENTRYPOINT覆盖方式​​

docker run -itd --name a5 --entrypoint="" nginx:latest sleep 3600

六、注意事项

​​减少镜像层​​

一次RUN指令形成新的一层,尽量Shell命令都写在一行,减少镜像层。

​​避免使用ADD​​

​​优化镜像大小:清理无用数据​​

一次RUN形成新的一层,如果没有在同一层删除,无论文件是否最后删除,都会带到下一层,所以要在每一层清理对应的残留数据,减小镜像大小。

如执行完yum装包后需用yum clean all清除缓存包

​​多阶段进行镜像构建​​

例如,构建JAVA项目镜像:

# git clone cd tomcat-java-demo# vi DockerfileFROM maven AS buildADD ./pom.xml pom.xmlADD ./src src/RUN mvn clean packageFROM lizhenliang/tomcatRUN rm -rf /usr/local/tomcat/webapps/ROOTCOPY --from=build target/*.war /usr/local/tomcat/webapps/ROOT.war# docker build -t demo:v1 .# docker container run -d -v demo:v1

首先,第一个FROM 后边多了个 AS 关键字,可以给这个阶段起个名字。 然后,第二部分FROM用的我们上面构建的Tomcat镜像,COPY关键字增加了—from参数,用于拷贝某个阶段的文件到当前阶段。这样一个Dockerfile就都搞定了。

​​COW写时复制技术决定不能在不同指令中操作同一目录​​

例如:

COPY files /opt/filesRUN chown -R test.test /opt/files

这会导致COPY层和RUN层均会复制一次/opt/files,如果/opt/files的大小为400M,那么RUN层的大小为400+M

建议:把类似chown -R test.test /opt/files的写操作放入init_container.sh脚本中,该脚本执行完毕后自己把自己删除

参考文章:

​​编写 Dockerfile 最佳实践​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:K8S之secret
下一篇:SpringCloud网关(Zuul)如何给多个微服务之间传递共享参数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~