9、Dockerfile语法
在Dockerfile中定义了很多关键字,通过关键字来完成Dockerfile的编写。
Dockerfile官方文档
1|09.1 FROM
在Dockerfile中FROM主要是指定这个Dockerfile基于哪一个base image构建。Docker Dockerfile按顺序运行指令。一个Dockerfile 必须用FROM
指令启动,放在第一行。
FROM scratch # 制作base image
FROM centos # 使用base image
FROM ubuntu:14.04 # 使用指定版本的base image
安全起见,尽量使用官方的image作为base image。
2|09.2 LABEL
在Dockerfile中LABEL实际上是英译了Metadata,就像是代码中的注释。主要包含了该镜像的作者、版本和描述信息。
LABEL maintainer="staryjie@163.com" LABEL version="1.0" LABEL description="This is description"
Metadata不可少!
3|09.3 RUN
在Dockerfile中RUN用来运行命令,其中命令必须是在第一行FROM中指定的base image所能运行的。每运行一次RUN,构建的image都会生成新的一层layer。
RUN yum update && yum install -y vim \ python-dev # 反斜杠换行
RUN apt-get update && apt-get install -y perl \ pwgen --no-install-recommends && rm -rf \ /var/lib/apt/lists/* # 注意清理cache
RUN /bin/bash -C 'source $HOME/.bashrc;echo $HOME'
为了美观,复杂的RUN可以使用反斜杠换行。
为了避免无用分层,多条命令尽量合并一行。
4|09.4 WORKDIR
在Dockerfile中WORKDIR用来设定当前工作目录,类似Linux系统中的cd命令。
WORKDIR /root
WORKDIR /test # 如果没有该目录,则会自动创建 WORKDIR demo RUN pwd # 输出的结果应该是/test/demo
用WORKDIR,不要使用RUN cd !!!
为了避免出错,尽量使用绝对路径。
5|09.4 ADD和COPY
在Dockerfile中ADD和COPY作用相似,都是把本地的文件添加到docker image中。区别:ADD不仅可以添加文件,还可以解压缩文件,COPY不可以解压缩文件。
ADD hello /
ADD test.tar.gz / # 添加到image的根目录并且解压
WORKDIR /root ADD hello test/ # 将hello添加到image的/root/test/hello
WORKDIR /root COPY hello test/ # 跟上面的效果一样
大部分情况下COPY优于ADD。
ADD除了COPY还有额外功能(解压)。
添加远程文件/目录,请使用curl或者wget。
6|09.5 ENV
在Dockerfile中ENV来设置环境变量或者一些常量。可以在ENV设置的常量后面直接使用。
ENV MYSQL_VERSION 5.6 # 设置常量 RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \ && rm -rf /var/lib/apt/lists/* #引用常量
尽量使用ENV增加可维护性!
7|09.6 VOLUME
在Dockerfile中VOLUME用于向基于镜像创建的容器添加卷,一个卷可以存在于一个或多个容器的特定目录,这个目录可以绕过联合文件系统,并提供共享数据、数据持久化的功能。
VOLUME ["/data"]
8|09.7 EXPOSE
在Dockerfile中EXPOSE设置容器暴露的端口,可以指定一个或多个端口。
EXPOSE 80
虽然在EXPOSE指令中已经暴露了指定的端口,但是在启动容器的时候还是要指定端口信息,容器本身不会自动暴露端口。
9|09.8 CMD
在Dockerfile中CMD设置容器启动后默认执行的命令和参数。如果定义了多个CMD,只会执行最后一个。
CMD ["executable","param1","param2"] # 执行形式,这是首选形式
CMD ["param1","param2"] # 作为进入点的默认参数
CMD command param1 param2 # 壳形式
不要定义多个CMD,多个CMD只有最后一个会执行。
10|09.9 ENTRYPOINT
在Dockerfile中ENTRYPOINT设置容器启动时运行的命令,可以让容器以应用程序或者服务器的形式运行,而且ENTRYPOINT设定的命令不会被忽略,一定会执行。
COPY docker-entrypoint.sh /usr/local/bin/ ENTRYPOINT ["docker-entrypoint.sh"]
可以写一个shell脚本作为ENTRYPOINT的入口。
11|0RUN、CMD、ENTRYPOINT对比
- RUN 执行命令并创建新的image layer
- CMD 设置容器启动后默认执行的命令和参数
- ENTRYPOINT 设置容器启动时运行的命令
11|1shell格式和exec格式
- shell格式
RUN apt-get install -y vim CMD echo "hello docker" ENTRYPOINT echo "hello docker"
Dockerfile
FROM centos ENV name Docker ENTRYPOINT echo "hello $name"
构建镜像:
docker build -t staryjie/centos-entrypoint-shell .
运行容器:
docker run staryjie/centos-entrypoint-shell hello Docker
- exec格式
RUN ["apt-get","install","-y","vim"] CMD ["/bin/echo","hello docker"] ENTRYPOINT ["/bin/echo","hello docker"]
Dockerfile
FROM centos ENV name Docker ENTRYPOINT ["/bin/echo","hello $name"]
构建镜像:
docker build -t staryjie/centos-entrypoint-exec .
运行容器:
docker run staryjie/centos-entrypoint-exec hello $name
改写Dockerfile
FROM centos ENV name Docker ENTRYPOINT ["/bin/bash","-c","echo hello $name"]
构建镜像:
docker build -t staryjie/centos-entrypoint-exec-new .
运行容器:
docker run staryjie/centos-entrypoint-exec-new hello Docker
- CMD
- 容器启动时默认执行的命令
- 如果docker run指定了其他命令,CMD命令会被忽略
- 如果定义了多个CMD,只有最后一个会执行
- ENTRYPOINT
- 让容器以应用程序或者服务的形式运行
- 不会被忽略,一定会执行
__EOF__

本文链接:https://www.cnblogs.com/jie-fang/p/10279690.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律