深入理解Dockerfile:构建镜像的详细解释与常用命令(上)

简介: Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。

Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。


1.Dockerfile 简介


Dockerfile 是一个文本文件,其中包含了一系列的指令和配置,用于自动化地构建 Docker 镜像。通过定义 Dockerfile,我们可以指定基础镜像、安装软件、复制文件、设置环境变量等一系列操作,以创建一个完整的容器化应用环境。


2.Dockerfile 指令解析


下面是一些常见的 Dockerfile 指令的解释和示例用法:


2.1 FROM


FROM 指令用于指定基础镜像。一个 Dockerfile 可以以 FROM 指令开始,以引入一个基础镜像作为构建环境的起点。示例:

FROM ubuntu:18.04

该指令从 Docker Hub 上拉取一个名为 "ubuntu" 的镜像,并指定标签为 "18.04"


2.2 RUN


RUN 指令用于在镜像中执行命令。可以使用该指令安装软件包、执行编译操作等。示例:

RUN apt-get update && apt-get install -y curl

该指令更新 apt 包管理工具的软件包列表,并安装 curl 软件包。


2.3 COPY


COPY 指令用于将文件或目录从构建环境复制到镜像中。示例:

COPY app.py /app/

该指令将构建环境中的 app.py 文件复制到镜像中的 /app/ 目录下。


2.4 ADD


ADD 指令类似于 COPY 指令,但它支持更多功能,如自动解压缩压缩包等。尽量使用 COPY 指令,除非确实需要 ADD 的高级功能。示例:

ADD archive.tar.gz /data/

该指令将构建环境中的 archive.tar.gz 压缩包复制到镜像中的 /data/ 目录下,并自动解压缩。


2.5 CMD


CMD 指令用于指定容器启动时默认执行的命令。一个 Dockerfile 中只能存在一个 CMD 指令。示例:

CMD ["python", "app.py"]

该指令在容器启动时执行 python app.py 命令。

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:


CMD 在docker run 时运行。

RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。


注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。


2.6 ENTRYPOINT


ENTRYPOINT 指令类似于 CMD 指令,但它不会被 docker run 命令行中的参数覆盖。示例:

ENTRYPOINT ["python"] CMD ["app.py"]

该指令将 python 设置为容器的默认执行命令,并且可以通过 docker run 的参数指定要执行的 app.py 文件。


类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。


但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。


优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。


注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。


可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。


示例:


假设已通过 Dockerfile 构建了 nginx:test 镜像:

FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参


1、不传参运行

docker run  nginx:test

容器内会默认运行以下命令,启动主进程。

nginx -c /etc/nginx/nginx.conf


2、传参运行

docker run  nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

nginx -c /etc/nginx/new.conf


2.7 ENV


ENV 指令用于设置环境变量。可以在 Dockerfile 中使用这些环境变量,并且它们会传递到容器运行时环境。示例:

ENV APP_HOME /app WORKDIR $APP_HOME

该指令设置一个名为 APP_HOME 的环境变量,并将其值设为 /app。接下来的 WORKDIR 指令将工作目录切换到环境变量 $APP_HOME 指定的路径。


2.8 ARG


ARG 指令用于定义构建参数,可以在构建镜像时传递参数。示例:

ARG VERSION RUN echo $VERSION

该指令定义了一个名为 VERSION 的构建参数,并在构建过程中输出其值。

2.9 EXPOSE


EXPOSE 指令用于声明容器运行时监听的端口。示例:


EXPOSE 8080

该指令声明容器将监听主机的 8080 端口。


2.10 WORKDIR


WORKDIR 指令用于设置工作目录。该目录将用作后续指令(如 RUN、CMD)的默认路径。示例:

WORKDIR /app

该指令将工作目录切换到 /app。


2.11 VOLUME


VOLUME 指令用于在镜像中创建一个或多个挂载点,并声明容器可以将这些挂载点暴露给主机或其他容器。示例:

VOLUME /data

该指令在镜像中创建一个名为 /data 的挂载点。


2.12 USER


USER 指令用于指定容器运行时的用户或用户组。示例:

USER nobody

该指令将容器运行时的用户设置为 "nobody"。


相关文章
|
6月前
|
Ubuntu Docker 容器
深入理解Dockerfile:构建镜像的详细解释与常用命令(下)
Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。
172 0
|
Linux Docker 容器
Docker中Dockerfile的构建过程
本章主要对Docker中自定义镜像的一种方式,docker进行简单的介绍。
140 1
Docker中Dockerfile的构建过程
|
6月前
|
Java 持续交付 Docker
Docker 项目如何使用 Dockerfile 构建镜像?
Docker 简介:讲述 Docker 的起源、它是如何革新现代软件开发的,以及它为开发者和运维团队带来的好处。重点强调 Docker 的轻量级特性和它在提高应用部署、扩展和隔离方面的优势。
180 0
|
1月前
|
缓存 应用服务中间件 nginx
dockerfile构建镜像详细解释与应用
Dockerfile 是一种可被 Docker 程序解释的脚本,用于定义如何构建容器镜像。它通过一系列指令指定镜像的配置和定制需求,支持自动化构建,简化开发、测试和部署流程。
|
6月前
|
存储 应用服务中间件 nginx
docker 安装及 基础使用方法(一)
docker 安装及 基础使用方法(一)
|
6月前
|
Shell Linux 数据安全/隐私保护
docker 安装及 基础使用方法(二)
docker 安装及 基础使用方法(二)
|
6月前
|
应用服务中间件 Shell nginx
制作docker镜像的dockerfile编写规则汇总
制作docker镜像的dockerfile编写规则汇总
116 0
|
6月前
|
Java 网络安全 开发者
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
107 0
|
6月前
|
应用服务中间件 nginx Docker
docker系列:dockerfile及其用法解析
docker系列:dockerfile及其用法解析
233 0
|
6月前
|
缓存 Ubuntu JavaScript
Docker自定义镜像-构建镜像-Dockerfile语法
Docker自定义镜像-构建镜像-Dockerfile语法
109 0