# docker image push

## 描述

将镜像上传到镜像仓库（registry）。

## 用法

```shellscript
docker image push [OPTIONS] NAME[:TAG]
```

### 别名

`docker push` 是 `docker image push` 的简写别名。

使用 `docker image push` 可以将你的镜像分享到 [Docker Hub](https://hub.docker.com/) 或你自建的镜像仓库中。 有关合法的镜像名称和标签格式，请参阅 [`docker image tag` 命令参考文档](https://docs.docker.com/engine/reference/commandline/image_tag/)。

如果在终端中运行 `docker image push` 时按 `CTRL-C` 中断该进程，推送操作会被终止。

推送过程中会显示进度条，显示的是**未压缩的镜像大小**。实际上传的数据会在发送前被压缩，因此进度条所显示的大小并不等于实际上传的数据量。

镜像仓库的凭据通过 `docker login` 命令进行管理。

默认情况下，Docker 守护进程会**同时推送 5 个镜像层**。如果你处于低带宽网络环境中，这可能会导致超时问题。你可以通过修改守护进程的 `--max-concurrent-uploads` 选项来降低并发数。更多详情请参见 [Docker 守护进程文档](https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file)。

## 选项

| 短选项  | 长选项                       | 默认值    | 描述                                                                                                                                         |
| ---- | ------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `-a` | `--all-tags`              | 无      | 推送本地镜像的所有标签到仓库                                                                                                                             |
| 无    | `--disable-content-trust` | `true` | 跳过镜像签名验证                                                                                                                                   |
| 无    | `--platform`              | 无      | （API 1.46+）推送特定平台的清单（manifest）作为单平台镜像。不会推送镜像索引（image index），这意味着其他清单（包括证明信息 attestations）不会被保留。 格式为 `os[/arch[/variant]]`，例如 `linux/amd64` |
| `-q` | `--quiet`                 | 无      | 静默模式，抑制详细输出                                                                                                                                |

## 示例

### 将新镜像推送到仓库

首先，通过容器 ID（使用 `docker container ls` 查找）将容器提交为新镜像。注意：镜像名称只能包含小写字母、数字、连字符（`-`）、下划线（`_`）和点（`.`）：

```bash
$ docker container commit c16378f943fe rhel-httpd:latest
```

然后，将该镜像推送到仓库。假设你的私有仓库运行在主机 `registry-host` 的 5000 端口上。你需要先为镜像打上包含仓库地址和端口的标签：

```bash
$ docker image tag rhel-httpd:latest registry-host:5000/myadmin/rhel-httpd:latest
$ docker image push registry-host:5000/myadmin/rhel-httpd:latest
```

验证是否成功：

```bash
$ docker image ls
```

你应该能看到 `rhel-httpd` 和 `registry-host:5000/myadmin/rhel-httpd` 两个镜像。

***

### 推送镜像的所有标签（使用 `-a` 或 `--all-tags`）

以下示例为同一镜像创建多个标签，并一次性全部推送到仓库：

```bash
$ docker image tag myimage registry-host:5000/myname/myimage:latest
$ docker image tag myimage registry-host:5000/myname/myimage:v1.0.1
$ docker image tag myimage registry-host:5000/myname/myimage:v1.0
$ docker image tag myimage registry-host:5000/myname/myimage:v1
```

查看当前镜像列表：

```bash
$ docker image ls
REPOSITORY                             TAG       IMAGE ID       CREATED        SIZE
myimage                                latest    6d5fcfe5ff17   2 hours ago    1.22GB
registry-host:5000/myname/myimage      latest    6d5fcfe5ff17   2 hours ago    1.22GB
registry-host:5000/myname/myimage      v1        6d5fcfe5ff17   2 hours ago    1.22GB
registry-host:5000/myname/myimage      v1.0      6d5fcfe5ff17   2 hours ago    1.22GB
registry-host:5000/myname/myimage      v1.0.1    6d5fcfe5ff17   2 hours ago    1.22GB
```

使用 `--all-tags` 选项推送所有标签：

```bash
$ docker image push --all-tags registry-host:5000/myname/myimage
```

输出示例：

```
The push refers to repository [registry-host:5000/myname/myimage]
195be5f8be1d: Pushed
latest: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527
195be5f8be1d: Layer already exists
v1: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527
195be5f8be1d: Layer already exists
v1.0: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527
195be5f8be1d: Layer already exists
v1.0.1: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527
```
