关于Dockerfile
Dockerfile实际上就是一系列创建Docker镜像的脚本, 虽然可以通过命令行来执行, 但是那样繁琐而且容易出错.
Dockerfile指令
FROM
他的意思是在创建新的镜像时使用的基础镜像.
- 格式:
- From [name]
- 示例:
- From nginx
- From microsoft/dotnet-aspnetcore-runtime
RUN
他的意思是在容器中需要运行的命令, 它包括安装软件、创建文件和目录, 以及创建环境配置等.
- 格式:
- Run ["","",""]
- Run [command]
- 示例:
- Run npm install npm -g
- Run mkdir -p /usr/src/redis
- Run npm install && npm start
- Run ["npm","install","npm","-g"]
COPY
Copy指令将文件或者目录复制到容器的文件系统, 文件和目录需位于相对于Dockerfile的路径中.
- 格式:
- Copy [ospath] [dockerpath]
- Copy ["",""]
- 示例:
- Copy . .
- Copy nginx.conf /etc/nginx/nginx.conf
- Copy . /usr/share/nginx/html
- Copy hom* /mydir/
ADD
Add指令与Copy指令非常类似,但它包含更多功能。除了将文件从主机复制到容器映像,Add指令还可以使用URL规范从远程位置复制文件。
- 格式:
- Add [source] [destination]
- 示例:
- Add https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe
WORKDIR
Workdir指定的功能相当于使用cd切换工作目录.
- 格式:
- Workdir [newpath]
- 示例:
- Workdir /app
ENTRYPOINT
配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。每个Dockerfile中只能有一个Entrypoint,当指定多个时,只有最后一个有效。
- 格式:
- Entrypoint ["", ""]
- 示例:
- Entrypoint ["dotnet", "App.Web.Host.dll"]
ENV
ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。
- 格式:
- Env [name]=[value]
- 示例:
- Env VERSION=1.0 DEBUG=on NAME="Magicodes"
CMD
Cmd指令用于设置部署容器映像的实例时要运行的默认命令。如果 Dockerfile中指定了多个Cmd指令,只会计算最后一个指令。也可以使用如下命令行在启动时重载:
docker run [$image] [$other_command]
EXPOSE
Expose用来指定端口,使容器内的应用可以通过端口和外界交互。
- 格式:
- Expose [port]
- 示例:
- Expose 80
补充
总结
通过上述我们可以看到RUN、ENTRYPOINT和CMD都是执行命令, 但是其实他们是有区别的.
执行的时间点不同, 作用也不同, 按顺序如下:
- RUN:创建镜像时, 通常用于安装软件包
- ENTRYPOINT:启动容器时, 可以用来输出日志
- CMD:启动容器后, 可以用来启动应用
转义字符
在许多情况下, Dockerfile指令需要跨多个行;这可通过转义字符完成。 默认Dockerfile转义字符是反斜杠"". 由于反斜杠在Windows中也是一个文件路径分隔符,这可能导致出现问题。
所以在Windows下可以修改转义字符, 方法是Dockerfile的第一行放置如下转义分析程序指令:
# escape=`
注意,只有两个值可用作转义字符:?和 ` 。
优化
大致总结优化规则如下:
- 选择合适的基础镜像
- 优化指令顺序
- 合并指令
- 删除多余文件和清理没用的中间结果
- 使用 .dockerignore
原文地址:https://www.cnblogs.com/jerryqi/p/11777269.html