Dockerfile 中对常用命令详解
说明
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
在Dockerfile 中命令书写对先后顺序及表示其执行对顺序,在书写时需注意。
约定
命令不区分大小写,但是命名约定为全部大写。
常用命令
FROM
所有Dockerfile 都必须以
FROM
命令开始。
FROM
命令会指定镜像基于哪个基础镜像来进行创建,后面对命令也会机会这个镜像来执行。
FROM
命令可以多次使用,表示创建多个镜像。
语法如下:
FROM [images name]
例如:
FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal AS base
WORKDIR
WORKDIR
命令用于指定RUN
、CMD
、ENTRYPOINT
等命令对工作目录。
语法如下:
WORKDIR [path]
例如:
WORKDIR /app
EXPOSE
EXPOSE
用于指定容器在运行时监听对端口
语法如下:
EXPOSE [port]
例如:
EXPOSE 8080
COPY
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
语法如下:
COPY [path,newpath]
例如:
COPY src/nuget.config nuget.config
ADD
ADD
指令和COPY
的使用格类似(同样需求下,官方推荐使用COPY
)。功能也类似
在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
语法如下:
ADD [path,newpath]
例如:
ADD src/nuget.config nuget.config
RUN
RUN
在shell或者exec的环境下执行的命令。RUN
指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。
语法如下:
RUN ["<可执行文件或命令>","<param1>","<param2>",...]
例如:
-- 还原项目资源包
RUN dotnet restore "HanddayRetail.MallApi/HanddayRetail.MallApi.csproj" --configfile "nuget.config"
-- 构建项目
RUN dotnet build "HanddayRetail.MallApi/HanddayRetail.MallApi.csproj" -c Release -o /app/build
CMD
CMD
类似于 RUN 指令,用于运行程序,CMD 指令指定的程序可被docker run
命令行参数中指定要运行的程序所覆盖。,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["param1","param2"]
CMD command param1 param2
注意:如果 Dockerfile 中如果存在多个 CMD
指令,仅最后一个生效。
ENTRYPOINT
ENTRYPOINT
配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。
类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。
语法如下:
ENTRYPOINT ["<可执行文件或命令>","<param1>","<param2>",...]
ENTRYPOINT command param1 param2
例如:
ENTRYPOINT ["dotnet", "HanddayRetail.MallApi.dll"]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构