linux怎么查看本机内存大小
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 docker.io/nginx
MAINTAINER[可选]
镜像维护人的信息 MAINTAINER
示例:MAINTAINER 运维@小兵 邮箱地址
LABEL[可选]
指定该dockerfile的基本信息,如维护者、版本等
例如:LABEL author=“运维@小兵” version=“1.0” describe=“构建nginx镜像”
EXPOSE[可选]
例如:EXPOSE 80 443
告诉 Docker 服务,容器需要暴露的端口号
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~