command: docker image push
aliases: docker image push, docker push
short: Upload an image to a registry
long: |-
    Use `docker image push` to share your images to the [Docker Hub](https://hub.docker.com)
    registry or to a self-hosted one.

    Refer to the [`docker image tag`](/reference/cli/docker/image/tag/) reference for more information
    about valid image and tag names.

    Killing the `docker image push` process, for example by pressing `CTRL-c` while it is
    running in a terminal, terminates the push operation.

    Progress bars are shown during docker push, which show the uncompressed size.
    The actual amount of data that's pushed will be compressed before sending, so
    the uploaded size will not be reflected by the progress bar.

    Registry credentials are managed by [docker login](/reference/cli/docker/login/).

    ### Concurrent uploads

    By default the Docker daemon will push five layers of an image at a time.
    If you are on a low bandwidth connection this may cause timeout issues and you may want to lower
    this via the `--max-concurrent-uploads` daemon option. See the
    [daemon documentation](/reference/cli/dockerd/) for more details.
usage: docker image push [OPTIONS] NAME[:TAG]
pname: docker image
plink: docker_image.yaml
options:
    - option: all-tags
      shorthand: a
      value_type: bool
      default_value: "false"
      description: Push all tags of an image to the repository
      details_url: '#all-tags'
      deprecated: false
      hidden: false
      experimental: false
      experimentalcli: false
      kubernetes: false
      swarm: false
    - option: disable-content-trust
      value_type: bool
      default_value: "true"
      description: Skip image verification (deprecated)
      deprecated: true
      hidden: true
      experimental: false
      experimentalcli: false
      kubernetes: false
      swarm: false
    - option: platform
      value_type: string
      description: |-
        Push a platform-specific manifest as a single-platform image to the registry.
        Image index won't be pushed, meaning that other manifests, including attestations won't be preserved.
        'os[/arch[/variant]]': Explicit platform (eg. linux/amd64)
      deprecated: false
      hidden: false
      min_api_version: "1.46"
      experimental: false
      experimentalcli: false
      kubernetes: false
      swarm: false
    - option: quiet
      shorthand: q
      value_type: bool
      default_value: "false"
      description: Suppress verbose output
      deprecated: false
      hidden: false
      experimental: false
      experimentalcli: false
      kubernetes: false
      swarm: false
inherited_options:
    - option: help
      value_type: bool
      default_value: "false"
      description: Print usage
      deprecated: false
      hidden: true
      experimental: false
      experimentalcli: false
      kubernetes: false
      swarm: false
examples: |-
    ### Push a new image to a registry

    First save the new image by finding the container ID (using [`docker container
    ls`](/reference/cli/docker/container/ls/)) and then committing it to a new image name. Note that
    only `a-z0-9-_.` are allowed when naming images:

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

    Now, push the image to the registry using the image ID. In this example the
    registry is on host named `registry-host` and listening on port `5000`. To do
    this, tag the image with the host name or IP address, and the port of the
    registry:

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

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

    Check that this worked by running:

    ```console
    $ docker image ls
    ```

    You should see both `rhel-httpd` and `registry-host:5000/myadmin/rhel-httpd`
    listed.

    ### Push all tags of an image (-a, --all-tags) {#all-tags}

    Use the `-a` (or `--all-tags`) option to push all tags of a local image.

    The following example creates multiple tags for an image, and pushes all those
    tags to Docker Hub.


    ```console
    $ 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
    ```

    The image is now tagged under multiple names:

    ```console
    $ docker image ls

    REPOSITORY                          TAG        IMAGE ID       CREATED      SIZE
    myimage                             latest     6d5fcfe5ff17   2 hours ago  1.22MB
    registry-host:5000/myname/myimage   latest     6d5fcfe5ff17   2 hours ago  1.22MB
    registry-host:5000/myname/myimage   v1         6d5fcfe5ff17   2 hours ago  1.22MB
    registry-host:5000/myname/myimage   v1.0       6d5fcfe5ff17   2 hours ago  1.22MB
    registry-host:5000/myname/myimage   v1.0.1     6d5fcfe5ff17   2 hours ago  1.22MB
    ```

    When pushing with the `--all-tags` option, all tags of the `registry-host:5000/myname/myimage`
    image are pushed:


    ```console
    $ 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
    ```
deprecated: false
hidden: false
experimental: false
experimentalcli: false
kubernetes: false
swarm: false

