> For the complete documentation index, see [llms.txt](https://camelgemonion.gitbook.io/docker/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://camelgemonion.gitbook.io/docker/dockerfile-zhi-ling/usage.md).

# Usage

使用方法

**docker build**命名根据**dockerfile**和**上下文（context）**&#x6765;构建一个镜像。

**docker build**命令从**Dockerfile**和**上下文**构建映像。构建的上下文是位于指定位置**PATH**或**URL**的文件集。 **PATH**是本地文件系统上的目录。该**URL**是一个**Git存储库**位置。

**上下文**是**递归处理**的。因此，**PATH**包括任何子目录，而**URL**包括存储库及其子模块。此示例显示了一个使用当前目录作为上下文的构建命令：

```
docker build . #从当前上下文构建镜像

Sending build context to Docker daemon  6.51 MB
...
```

**构建（build）**&#x662F;由**Docker守护进程**而不是**CLI**运行的。构建过程要做的第一件事是将整个**上下文（递归）**&#x53D1;送到**Docker守护进程**。在大多数情况下，最好以空目录作为上下文，并将**Dockerfile**保留在该目录中。仅添加构建**Dockerfile**所需的文件。

要在构建上下文中使用文件，**Dockerfile**引用指&#x4EE4;**（例如COPY指令）**&#x4E2D;指定的文件。为了提高构建的性能，请通过在上下文目录中添&#x52A0;**.dockerignore**文件来排除相应的文件和目录。

通常，**Dockerfile**位于上下文的根目录中。&#x5C06;**-f**与**docker build**组合起来使用可以指向文件系统中任何位置的**Dockerfile**。

**Note: 不要将根目录/用作PATH，因为它会导致构建将硬盘驱动器的全部内容传输到Docker守护进程。**

```bash
$ docker build -f /path/to/a/Dockerfile .
```

如果构建成功，则可以指定存储镜像的存储库和**标签（tag）**：

```bash
$ docker build -t shykes/myapp .
```

同时构建多个镜像：

```bash
docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
```

在**Docker守护进程**运行**Dockerfile**中的指令之前，它会对**Dockerfile**进行初步验证，如果语法不正确，则会返回错误：

```bash
$ docker build -t test/myapp .

Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD
```

**Docker守护进程**逐一运行**Dockerfile**中的指令，并在最终输出新镜像的**ID**之前，如有必要，将每个指令的结果提交到新镜像。 **Docker守护进程**会自动清理发送的上下文。

**Note: 每条指令都是独立运行的，每条指令运行时会创建一层新的镜像-因此RUN cd /tmp对下一条指令不会有任何影响。**

**Docker**将尽可能的重用中间镜&#x50CF;**（缓存）**，以加快**Docker**镜像的构建过程。这由控制台输出中&#x7684;**"Use Cache"**&#x6D88;息指示。

```bash
$ docker build -t svendowideit/ambassador .

Sending build context to Docker daemon 15.36 kB
Step 1/4 : FROM alpine:3.2
 ---> 31f630c65071
Step 2/4 : MAINTAINER SvenDowideit@home.org.au
 ---> Using cache
 ---> 2a1c91448f5f
Step 3/4 : RUN apk update &&      apk add socat &&        rm -r /var/cache/
 ---> Using cache
 ---> 21ed6e7fbb73
Step 4/4 : CMD env | grep _TCP= | (sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' && echo wait) | sh
 ---> Using cache
 ---> 7ea8aef582cc
Successfully built 7ea8aef582cc
```

构建缓存仅用于具有本地父链的镜像。这意味着这些镜像是由以前的版本创建的，或者整个镜像链都已由**docker load**加载。如果希望使用特定镜像的构建缓存，则可以使&#x7528;**--cache-from选项**来指定它。&#x7528;**--cache-from**指定的镜像不需要具有父链，并且可以从其他**docker**仓库拉取。

当我们构建好镜像以后，可以将镜像推送到自己的私人仓库。

[**如何push镜像**](https://docs.docker.com/docker-hub/repos/)

##
