Dockerfile默认的执行路径是构建镜像时的上下文路径,即Dockerfile所在的目录。
Dockerfile中的指令通常包括设置基础镜像、复制文件、安装软件包、设置环境变量、定义容器启动时要运行的命令等。这些指令都是基于Dockerfile所在的目录来执行的,因此,Dockerfile中引用的文件或目录路径都是相对于该目录的。
举个例子,如果你在Dockerfile中使用了COPY
指令来复制一个文件到镜像中,你需要指定源文件相对于Dockerfile的路径。如果源文件就在Dockerfile所在的目录下,你可以直接写文件名;如果源文件在子目录中,你需要写子目录/文件名。
Dockerfile中常用配置项:
FROM:
指定基础镜像,新镜像将基于这个基础镜像构建。
RUN:
在镜像构建时执行命令,如安装软件包、设置环境变量等。
格式:RUN <command>
或 RUN ["executable", "param1", "param2"]
。
CMD:
设置容器启动时默认执行的命令。
格式:CMD ["executable","param1","param2"]
或 CMD command param1 param2
或 CMD ["param1","param2"]
(作为ENTRYPOINT的默认参数)。
ENTRYPOINT:
配置容器启动时运行的命令,使得容器以应用程序的方式运行。
格式:ENTRYPOINT ["java", "-jar", "/app.jar"]
在这个例子中,当容器启动时,它会执行java -jar /app.jar命令来运行指定的Java应用程序。
COPY:
将本地文件或目录复制到Docker镜像的指定路径中
格式:COPY <src>... <dest>
。
比如
COPY . .
这个命令实际上做了两件事情:
- 第一个
.
指的是构建上下文中的当前目录。构建上下文通常是你在运行docker build
命令时所在的目录,或者是通过-f
参数指定的 Dockerfile 所在的目录。这个目录中的所有文件和子目录都会被考虑在内。 - 第二个
.
是目标路径,也就是镜像内的路径。在这里,它表示镜像的当前工作目录。因此,COPY . .
会将构建上下文中的所有文件和目录复制到镜像的当前工作目录中。
ADD:
与COPY类似,但还可以从URL获取文件并自动解压缩。
格式:ADD <src>... <dest>
。
WORKDIR:
设置容器内的工作目录,即容器内部,命令执行时的默认路径。用于RUN、CMD、ENTRYPOINT、COPY和ADD指令。
格式:WORKDIR /path/to/workdir
。
VOLUME:
用于为容器指定一个或多个挂载点。这些挂载点可以用于将宿主机的目录或文件与容器内部进行共享,从而实现数据的持久化存储。
使用VOLUME指令的一个常见场景是数据库容器。例如,你可以使用VOLUME指令将MySQL数据库的存储目录挂载到容器外部,这样即使MySQL容器被删除或重建,数据库的数据也会保留在宿主机上,不会被丢失。
例如,你可以在Dockerfile中添加如下指令来声明一个数据卷:
Dockerfile:
VOLUME /var/lib/mysql
在运行容器时,使用-v选项将数据卷映射到宿主机的目录来实现数据的持久化存储:-v <宿主机目录或文件>:<容器目录或文件>
bash:
|
在这个例子中,/host/path
是宿主机上的目录,/var/lib/mysql
是容器内的目录。通过 -v
参数,你将宿主机的 /host/path
目录挂载到了容器的 /var/lib/mysql
目录上。这样,容器对 /var/lib/mysql
目录的读写操作实际上是在操作宿主机上的 /host/path
目录,从而实现了数据的持久化。
EXPOSE:
声明容器要监听的端口,方便外部访问容器服务。
格式:EXPOSE <port> [<port>...]
。
ENV:
设置环境变量。可以在构建镜像和启动容器时调用。
格式:ENV <key>=<value> [<key>=<value>...]
。
LABEL:
为镜像添加元数据标签,比如版本号。
格式:LABEL <key>=<value> [<key>=<value>...]
。
USER:
设置运行容器时使用的用户名或UID和组名或GID。
格式:USER <user>[:<group>]
或 USER <uid>[:<gid>]
。
ARG:
定义构建时的环境变量,仅在构建过程中有效。(可以后续覆盖)
格式:ARG <name>[=<default value>]
。
ONBUILD:
定义在当前镜像基础上构建新镜像时需要执行的操作。
格式:ONBUILD [INSTRUCTION]
。
STOPSIGNAL:
设置容器停止时发送的信号。
HEALTHCHECK:
定义容器健康检查指令,用于判断容器是否正常运行。