每天一点基础K8S--dockerfile的常见语法
`
docker file 类似于ansible 中的playbook文件,按需对docker image进行定制修改。
参考文件可以通过man dockerfile查看,也可以去官网查看
dockerfile中,常用语法主要包括:
1、FROM
表示新构建的镜像的原始镜像,他的妈是谁,有点从本地拉取,如果本地没有,就从docker hub上拉取;
FROM image
FROM image:tag
FROM image@digest
2、MAINTAINCE:作者
3、RUN
docker bulid期间运行一条命令;
shell模式:RUN <command>。 RUN touch testfile
exec 模式:RUN [“executable”,“param1”,“param2”]、RUN [“/bin/bash” “-c” “touch testfile”]
4、EXPOSE
声明端口,仅仅是声明,docker run的时候需要用-p进行映射;
EXPOSE <port1> [<port2>…]
5、CMD:docker run的时候运行一条命令,容易被覆盖
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD指令指定的程序可被docker run命令行参数中指定要运行的程序所覆盖。
CMD[“executable”,“param1”,“param2”](exec模式)
CMD command(shell模式)
CMD [“param1”,”param2”](作为ENTRYPOINT指令的默认参数)
6、ENTRYPOINT
类似于CMD指令,但其不会被docker run的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序。
但是,如果运行docker run时使用了--entrypoint选项,将覆盖entrypoint指令指定的程序。
优点:在执行docker run的时候可以指定ENTRYPOINT运行所需的参数。
注意:如果Dockerfile中如果存在多个ENTRYPOINT指令,仅最后一个生效。
ENTRYPOINT [“executable”,“param1”,“param2”](exec模式)
ENTRYPOINT command(shell模式)
可以搭配CMD命令使用:一般是变参才会使用CMD,这里的CMD等于是在给ENTRYPOINT传参,
7、COPY (推荐)
从上下文目录中复制文件或者目录到容器里指定路径。也可以从远端copy remote file URL
第一种:COPY<src>..<dest>
第二种:COPY[“<src>”...“<dest>”]
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
The <dest> is the absolute path, or path relative to WORKDIR
8、ADD:
第一种:ADD <src> <dest>
第二种:ADD ["<src>",... "<dest>”]
The <dest> is the absolute path, or path relative to WORKDIR
ADD的优点:在执行<源文件>为tar压缩文件的话,压缩格式为gzip,bzip2以及xz的情况下,会自动复制并解压到<目标路径>。
ADD的缺点:在不解压的前提下,无法复制tar压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
从远端URL拷贝的时候,建议是执行wget或者curl命令下载,这样封装层级更少。
ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all
替换为
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
9、LABEL
给镜像添加一些说明、标签等信息,可通过docker image inspect查看
第一种:LABEL <key>=<value> [<key>=<value> ...]
第二种:
LABEL <key>[ <value>]
LABEL <key>[ <value>]
10、VOLUME
volume这部分东西可以看看我之前的docker数据持久化配置部分。docker的持久化存储--data volume/bind mounts
VOLUME ["/data”]
会自动在容器中生成挂载点,并创建docker volume进行挂在,也可以从其他container进行挂载。
11、WORKDIR
WORKDIR /path/to/workdir
The WORKDIR instruction sets the working directory for the RUN, CMD, ENTRYPOINT, COPY and ADD Dockerfile commands that follow it. 这些命令执行的相对路径。可以同时存在多个WORKDIR。
12、ENV
ENV <key> <value>
ENV定义之后,就可以在dockerfile后续的RUN, ENTRYPOINT, and CMD中进行调用。
可以通过docker inspect to inspect these values查看定义的ENV
13、USER
指定command以什么用户执行。Sets the username or UID used for running subsequent commands
USER [user | user:group | uid | uid:gid | user:gid | uid:group ]
用户需要提前存在。
14、ARG
构建参数,与ENV作用一至。不过作用域不一样。ARG设置的环境变量仅对Dockerfile内有效,也就是说只有docker build的过程中有效,构建好的镜像内不存在此环境变量。
15、ONBUILD
用于延迟构建命令的执行。简单的说,就是Dockerfile里用ONBUILD指定的命令,在本次构建镜像的过程中不会执行(假设镜像为test-build)。
当有新的Dockerfile使用了之前构建的镜像FROMtest-build,这时执行新镜像的Dockerfile构建时候,会执行test-build的Dockerfile里的ONBUILD指定的命令。
`
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言