Dockerfile引用的官网文档:
https://docs.docker.com/engine/reference/builder/
编写Dockerfiles的最佳实践的官网文档:
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
Docker可以通过阅读来自的指令自动构建图像
Dockerfile
。
Dockerfile
是一个文本文档,其中包含用户可以在命令行上调用以组合图像的所有命令。使用
docker build
用户可以创建一个连续执行多个命令行指令的自动构建。
用法
该
docker build
命令
Dockerfile
根据
上下文
构建图像。构建的上下文是指定位置
PATH
或的文件集
URL
。这
PATH
是本地文件系统上的目录。这
URL
是一个Git存储库位置。
递归处理上下文。因此,a
PATH
包括所有子目录,
URL
包括存储库及其子模块。此示例显示使用当前目录作为上下文的构建命令:
例如:
docker build -f ./Dockerfile -t microsoft/dotnet:v1 .
(别忘记了后面有个点,详细了解docker build用法)
构建由Docker守护程序运行,而不是由CLI运行。构建过程所做的第一件事是将整个上下文(递归地)发送到守护进程。在大多数情况下,最好以空目录作为上下文,并将Dockerfile保存在该目录中。仅添加构建Dockerfile所需的文件。
警告
:不要用你的根目录下,
/
作为
PATH
因为它会导致生成到您的硬盘驱动器的全部内容传输到码头工人守护进程。
要在构建上下文中使用文件,请
Dockerfile
引用指令中指定的文件,例如
COPY
指令。要提高构建的性能,请通过向
.dockerignore
上下文目录添加文件来排除文件和目录。有关如何
创建.dockerignore 文件的信息,
请参阅此页面上的文档。
传统上,它
Dockerfile
被调用
Dockerfile
并位于上下文的根中。您可以使用
-f
标志
docker build
来指向文件系统中任何位置的Dockerfile。
指令集的功能用法
Dockerfile有十几条命令可用于构建镜像
Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。
指令
|
说明
|
FROM
|
指定所创建镜像的基础镜像
,FROM
指令必须指定且需要写在其他指令之前
.
如果本地镜像不存在
,
会去
Docker Hub
下载指定镜像
,Dockerfile
创建多个镜像使用多条
FROM
语句
.
支持三种格式
:
FROM <image> FROM <image>:<tag> FROM <image>@<digest>
示例
:
FROM microsoft/dotnet:2.2-aspnetcore-runtime
|
RUN
|
执行命令
,
是启动容器时才指定运行的指令
RUN
有两种形式:
1.RUN <command>
(
shell
表单,该命令在
shell
中运行,默认情况下
/bin/sh -c
在
Linux
或
cmd /S /CWindows
上运行)
2.RUN ["executable", "param1", "param2"]
(执行形式)
示例
:
RUN echo "hello world"
|
CMD
|
指定启动容器默认执行的命令
每个
Dodckerfile
只能有一条
CMD
命令,如果指定了多条命令,只有最后一条会被执行
CMD
有三种形式
:
CMD ["executable","param1","param2"]
(执行形式,这是首选形式)
CMD ["param1","param2"]
(作为
ENTRYPOINT
的默认参数)
CMD command param1 param2
(在
Shell
中使用)
示例
: CMD [ "dotnet","XXX.dll" ]
|
LABEL
|
指定生成镜像的元数据标签信息
格式
: LABEL <KEY>=<VALUE>
示例
: LABEL version=”1.0”
|
MAINTAINER
|
指定维护者信息
(
已过时
)
,格式为
MAINTAINER name
建议使用
LABEL
代替
,
例如
:LABEL maintainer=”cxt@docker.com”
|
EXPOSE
|
声明镜像内服务所监听的端口
示例
:EXPOSE 80
|
ENV
|
指定环境变量
,
环境变量可以在后续
RUN
指令中使用
格式
: ENV <key> <value>
示例
: ENV JAVA_HOME /path/to/java
|
ADD
|
ADD
指令用于复制文件
,
复制指定的
<src>
路径下的内容到容器中的
<dest>
路径下
,<src>
可以为
URL;
如果为
tar
文件,会自动解压到
<dest>
路径下
格式
: ADD <src>... <dest>
|
COPY
|
复制本地主机的
<src>
路径下的内容到镜像中的
<dest>
路径下
;COPY
指令和
ADD
指令类似
,COPY
不支持
URL
和压缩包一般情况下推荐使用
COPY,
而不是
ADD
格式
: COPY <src>... <dest>
示例
:COPY nginx.conf /etc/nginx/nginx.conf
|
ENTRYPOINT
|
指定镜像的默认入口
ENTRYPOINT
和
CMD
指令的目的一样,都是指定
Docker
容器启动时执行的命令,可多次设置,但只有最后一个有效
格式
: ENTRYPOINT ["executable", "param1", "param2"]
|
WORKDIR
|
WORKDIR
指令可以在创建容器时在容器内部指定一个工作目录
例如
: WORKDIR /data
|
Dockerfile示例;
FROM microsoft/dotnet:2.2-aspnetcore-runtime
LABEL version = "1.0"
RUN mkdir /data
COPY ./ /data
WORKDIR /data
EXPOSE 80
CMD [ "dotnet","Docker.dll" ]