2021-05-08 07:41:46 +08:00
[![GitHub release ](https://img.shields.io/github/release/docker/metadata-action.svg?style=flat-square )](https://github.com/docker/metadata-action/releases/latest)
2021-05-10 21:39:06 +08:00
[![GitHub marketplace ](https://img.shields.io/badge/marketplace-docker--metadata--action-blue?logo=github&style=flat-square )](https://github.com/marketplace/actions/docker-metadata-action)
2021-05-08 07:41:46 +08:00
[![Test workflow ](https://img.shields.io/github/workflow/status/docker/metadata-action/test?label=test&logo=github&style=flat-square )](https://github.com/docker/metadata-action/actions?workflow=test)
[![Codecov ](https://img.shields.io/codecov/c/github/docker/metadata-action?logo=codecov&style=flat-square )](https://codecov.io/gh/docker/metadata-action)
2021-03-29 19:04:53 +08:00
2020-10-25 09:25:23 +08:00
## About
2021-08-03 01:40:29 +08:00
GitHub Action to extract metadata from Git reference and GitHub events.
This action is particularly useful if used with [Docker Build Push ](https://github.com/docker/build-push-action ) action to tag and label Docker images.
2020-10-25 09:25:23 +08:00
2021-05-08 07:41:46 +08:00
![Screenshot ](.github/metadata-action.png )
2020-10-25 10:21:46 +08:00
2020-10-25 09:25:23 +08:00
___
* [Usage ](#usage )
2020-11-18 06:31:03 +08:00
* [Basic ](#basic )
* [Semver ](#semver )
2020-12-24 11:13:41 +08:00
* [Bake definition ](#bake-definition )
2020-10-25 09:25:23 +08:00
* [Customizing ](#customizing )
* [inputs ](#inputs )
* [outputs ](#outputs )
2021-03-29 19:04:53 +08:00
* [`flavor` input ](#flavor-input )
* [`tags` input ](#tags-input )
* [`type=schedule` ](#typeschedule )
* [`type=semver` ](#typesemver )
2021-07-06 19:56:48 +08:00
* [`type=pep440` ](#typepep440 )
2021-03-29 19:04:53 +08:00
* [`type=match` ](#typematch )
* [`type=edge` ](#typeedge )
* [`type=ref` ](#typeref )
* [`type=raw` ](#typeraw )
* [`type=sha` ](#typesha )
2020-10-25 22:13:43 +08:00
* [Notes ](#notes )
2020-10-29 01:25:31 +08:00
* [Latest tag ](#latest-tag )
2021-05-08 03:53:30 +08:00
* [Global expressions ](#global-expressions )
2021-05-08 06:01:13 +08:00
* [Major version zero ](#major-version-zero )
2021-05-23 03:23:06 +08:00
* [JSON output object ](#json-output-object )
2020-10-27 21:13:48 +08:00
* [Overwrite labels ](#overwrite-labels )
2020-10-25 09:25:23 +08:00
* [Keep up-to-date with GitHub Dependabot ](#keep-up-to-date-with-github-dependabot )
2020-11-18 06:31:03 +08:00
## Usage
### Basic
2020-10-25 22:17:39 +08:00
2020-11-18 06:31:03 +08:00
```yaml
name: ci
on:
push:
branches:
2021-03-29 19:04:53 +08:00
- 'master'
2020-11-18 06:31:03 +08:00
tags:
- 'v*'
pull_request:
2021-03-29 19:04:53 +08:00
branches:
- 'master'
2020-11-18 06:31:03 +08:00
jobs:
docker:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Docker meta
2021-03-29 19:04:53 +08:00
id: meta
2021-05-10 22:03:31 +08:00
uses: docker/metadata-action@v3
2020-11-18 06:31:03 +08:00
with:
images: name/app
-
name: Login to DockerHub
if: github.event_name != 'pull_request'
2020-12-24 11:13:41 +08:00
uses: docker/login-action@v1
2020-11-18 06:31:03 +08:00
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
2021-03-29 19:04:53 +08:00
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
2020-11-18 06:31:03 +08:00
```
2021-03-29 19:04:53 +08:00
| Event | Ref | Docker Tags |
|-----------------|-------------------------------|-------------------------------------|
| `pull_request` | `refs/pull/2/merge` | `pr-2` |
| `push` | `refs/heads/master` | `master` |
| `push` | `refs/heads/releases/v1` | `releases-v1` |
| `push tag` | `refs/tags/v1.2.3` | `v1.2.3` , `latest` |
| `push tag` | `refs/tags/v2.0.8-beta.67` | `v2.0.8-beta.67` , `latest` |
2020-11-18 06:31:03 +08:00
2021-03-29 19:04:53 +08:00
### Semver
2020-11-18 06:31:03 +08:00
```yaml
name: ci
on:
push:
branches:
2021-03-29 19:04:53 +08:00
- 'master'
2020-11-18 06:31:03 +08:00
tags:
- 'v*'
pull_request:
2021-03-29 19:04:53 +08:00
branches:
- 'master'
2020-11-18 06:31:03 +08:00
jobs:
docker:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Docker meta
2021-03-29 19:04:53 +08:00
id: meta
2021-05-10 22:03:31 +08:00
uses: docker/metadata-action@v3
2020-11-18 06:31:03 +08:00
with:
images: name/app
2021-03-29 19:04:53 +08:00
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
2020-11-18 06:31:03 +08:00
-
name: Login to DockerHub
if: github.event_name != 'pull_request'
2020-12-24 11:13:41 +08:00
uses: docker/login-action@v1
2020-11-18 06:31:03 +08:00
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
2021-03-29 19:04:53 +08:00
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
2020-11-18 06:31:03 +08:00
```
2021-03-29 19:04:53 +08:00
| Event | Ref | Docker Tags |
|-----------------|-------------------------------|-------------------------------------|
| `pull_request` | `refs/pull/2/merge` | `pr-2` |
| `push` | `refs/heads/master` | `master` |
| `push` | `refs/heads/releases/v1` | `releases-v1` |
| `push tag` | `refs/tags/v1.2.3` | `1.2.3` , `1.2` , `latest` |
| `push tag` | `refs/tags/v2.0.8-beta.67` | `2.0.8-beta.67` |
2020-12-24 11:13:41 +08:00
### Bake definition
2020-11-18 06:31:03 +08:00
2020-12-24 11:13:41 +08:00
This action also handles a bake definition file that can be used with the
2021-02-10 03:54:44 +08:00
[Docker Bake action ](https://github.com/docker/bake-action ). You just have to declare an empty target named
2021-05-10 21:54:35 +08:00
`docker-metadata-action` and inherit from it.
2020-12-24 11:13:41 +08:00
```hcl
// docker-bake.hcl
2021-05-10 21:54:35 +08:00
target "docker-metadata-action" {}
2020-12-24 11:13:41 +08:00
target "build" {
2021-05-10 21:54:35 +08:00
inherits = ["docker-metadata-action"]
2020-12-24 11:13:41 +08:00
context = "./"
dockerfile = "Dockerfile"
2021-06-23 18:04:02 +08:00
platforms = [
"linux/amd64",
"linux/arm/v6",
"linux/arm/v7",
"linux/arm64",
"linux/386"
]
2020-12-24 11:13:41 +08:00
}
```
2020-10-25 09:25:23 +08:00
```yaml
name: ci
on:
push:
branches:
2021-03-29 19:04:53 +08:00
- 'master'
2020-10-25 09:25:23 +08:00
tags:
2020-11-18 06:31:03 +08:00
- 'v*'
2020-10-25 09:25:23 +08:00
jobs:
docker:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Docker meta
2021-03-29 19:04:53 +08:00
id: meta
2021-05-10 22:03:31 +08:00
uses: docker/metadata-action@v3
2020-10-25 09:25:23 +08:00
with:
2020-10-27 07:57:32 +08:00
images: name/app
2021-03-29 19:04:53 +08:00
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=sha
2020-10-25 09:25:23 +08:00
-
2020-12-24 11:13:41 +08:00
name: Build
2021-02-10 03:54:44 +08:00
uses: docker/bake-action@v1
2020-10-25 09:25:23 +08:00
with:
2020-12-24 11:13:41 +08:00
files: |
./docker-bake.hcl
2021-03-29 19:04:53 +08:00
${{ steps.meta.outputs.bake-file }}
targets: build
2020-10-25 09:25:23 +08:00
```
2021-03-29 19:04:53 +08:00
Content of `${{ steps.meta.outputs.bake-file }}` file will look like this with `refs/tags/v1.2.3` ref:
2020-12-24 21:06:20 +08:00
```json
{
"target": {
2021-05-10 21:54:35 +08:00
"docker-metadata-action": {
2020-12-24 21:06:20 +08:00
"tags": [
2021-03-29 19:04:53 +08:00
"name/app:1.2.3",
"name/app:1.2",
"name/app:sha-90dd603",
2020-12-24 21:06:20 +08:00
"name/app:latest"
],
"labels": {
"org.opencontainers.image.title": "Hello-World",
"org.opencontainers.image.description": "This your first repo!",
"org.opencontainers.image.url": "https://github.com/octocat/Hello-World",
"org.opencontainers.image.source": "https://github.com/octocat/Hello-World",
2021-03-29 19:04:53 +08:00
"org.opencontainers.image.version": "1.2.3",
2020-12-24 21:06:20 +08:00
"org.opencontainers.image.created": "2020-01-10T00:30:00.000Z",
"org.opencontainers.image.revision": "90dd6032fac8bda1b6c4436a2e65de27961ed071",
"org.opencontainers.image.licenses": "MIT"
2020-12-24 23:45:28 +08:00
},
"args": {
"DOCKER_META_IMAGES": "name/app",
2021-03-29 19:04:53 +08:00
"DOCKER_META_VERSION": "1.2.3"
2020-12-24 21:06:20 +08:00
}
}
}
}
```
2020-10-25 09:25:23 +08:00
## Customizing
### inputs
Following inputs can be used as `step.with` keys
2020-12-24 05:09:38 +08:00
> `List` type is a newline-delimited string
> ```yaml
2021-03-31 16:01:20 +08:00
> labels: |
2020-12-24 05:09:38 +08:00
> org.opencontainers.image.title=MyCustomTitle
> org.opencontainers.image.description=Another description
> org.opencontainers.image.vendor=MyCompany
> ```
> `CSV` type is a comma-delimited string
> ```yaml
> images: name/app,ghcr.io/name/app
> ```
2020-10-25 09:25:23 +08:00
| Name | Type | Description |
|---------------------|----------|------------------------------------|
| `images` | List/CSV | List of Docker images to use as base name for tags |
2021-03-29 19:04:53 +08:00
| `tags` | List | List of [tags ](#tags-input ) as key-value pair attributes |
| `flavor` | List | [Flavor ](#flavor-input ) to apply |
| `labels` | List | List of custom labels |
2020-10-25 09:25:23 +08:00
| `sep-tags` | String | Separator to use for tags output (default `\n` ) |
| `sep-labels` | String | Separator to use for labels output (default `\n` ) |
2021-05-10 21:54:35 +08:00
| `bake-target` | String | Bake target name (default `docker-metadata-action` ) |
2020-10-25 09:25:23 +08:00
### outputs
Following outputs are available
| Name | Type | Description |
|---------------|---------|---------------------------------------|
2020-12-24 11:13:41 +08:00
| `version` | String | Docker image version |
| `tags` | String | Docker tags |
| `labels` | String | Docker labels |
2021-05-23 03:23:06 +08:00
| `json` | String | JSON output of tags and labels |
2020-12-24 11:13:41 +08:00
| `bake-file` | File | [Bake definition file ](https://github.com/docker/buildx#file-definition ) path |
2020-10-25 09:25:23 +08:00
2021-03-29 19:04:53 +08:00
## `flavor` input
2020-10-25 22:13:43 +08:00
2021-03-29 19:04:53 +08:00
`flavor` defines a global behavior for [`tags` ](#tags-input ):
2020-10-29 01:25:31 +08:00
2021-03-29 19:04:53 +08:00
```yaml
flavor: |
latest=auto
prefix=
suffix=
```
2020-11-21 06:12:14 +08:00
2021-03-29 19:04:53 +08:00
* `latest=<auto|true|false>` : Handle [latest tag ](#latest-tag ) (default `auto` )
2021-09-23 19:20:05 +08:00
* `prefix=<string>,onlatest=<true|false>` : A global prefix for each generated tag and optionally for `latest`
* `suffix=<string>,onlatest=<true|false>` : A global suffix for each generated tag and optionally for `latest`
2020-11-21 06:12:14 +08:00
2021-03-29 19:04:53 +08:00
## `tags` input
2020-11-19 00:56:34 +08:00
2021-03-29 19:04:53 +08:00
`tags` is the core input of this action as everything related to it will reflect the output metadata. This one is in
the form of a key-value pair list in CSV format to remove limitations intrinsically linked to GitHub Actions
(only string format is handled in the input fields). Here is an example:
2020-10-25 22:13:43 +08:00
2021-03-29 19:04:53 +08:00
```yaml
tags: |
type=schedule
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
2021-10-03 23:30:52 +08:00
type=ref,event=branch
type=ref,event=pr
2021-03-29 19:04:53 +08:00
type=sha
```
Each entry is defined by a `type` , which are:
* [`type=schedule` ](#typeschedule )
* [`type=semver` ](#typesemver )
2021-10-03 23:30:52 +08:00
* [`type=pep440` ](#typepep440 )
2021-03-29 19:04:53 +08:00
* [`type=match` ](#typematch )
* [`type=edge` ](#typeedge )
* [`type=ref` ](#typeref )
* [`type=raw` ](#typeraw )
* [`type=sha` ](#typesha )
And global attributes:
* `enable=<true|false>` enable this entry (default `true` )
* `priority=<number>` priority to manage the order of tags
* `prefix=<string>` add prefix
* `suffix=<string>` add suffix
Default entries if `tags` input is empty:
```yaml
tags: |
type=schedule
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
```
### `type=schedule`
```yaml
tags: |
# minimal
type=schedule
# default
type=schedule,pattern=nightly
# handlebars
type=schedule,pattern={{date 'YYYYMMDD'}}
```
Will be used on [schedule event ](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#schedule ).
`pattern` is a specially crafted attribute to support [Handlebars template ](https://handlebarsjs.com/guide/ ) with
2020-10-25 22:13:43 +08:00
the following expressions:
2021-03-29 19:04:53 +08:00
* `date 'format'` ; render date by its [moment format ](https://momentjs.com/docs/#/displaying/format/ )
| Pattern | Output |
|--------------------------|----------------------|
| `nightly` | `nightly` |
| `{{date 'YYYYMMDD'}}` | `20210326` |
Extended attributes and default values:
```yaml
tags: |
type=schedule,enable=true,priority=1000,prefix=,suffix=,pattern=nightly
```
### `type=semver`
```yaml
tags: |
# minimal
type=semver,pattern={{version}}
# use custom value instead of git tag
type=semver,pattern={{version}},value=v1.0.0
```
Will be used on a [push tag event ](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#push )
2021-07-06 19:56:48 +08:00
and requires a valid [semver ](https://semver.org/ ) Git tag, but you can also use a custom value through `value`
2021-03-29 19:04:53 +08:00
attribute.
`pattern` attribute supports [Handlebars template ](https://handlebarsjs.com/guide/ ) with the following expressions:
2021-07-06 19:56:48 +08:00
* `raw` ; the actual tag
2021-03-29 19:04:53 +08:00
* `version` ; shorthand for `{{major}}.{{minor}}.{{patch}}` (can include pre-release)
* `major` ; major version identifier
* `minor` ; minor version identifier
* `patch` ; patch version identifier
| Git tag | Pattern | Output |
|--------------------|----------------------------------------------------------|----------------------|
| `v1.2.3` | `{{raw}}` | `v1.2.3` |
| `v1.2.3` | `{{version}}` | `1.2.3` |
| `v1.2.3` | `{{major}}.{{minor}}` | `1.2` |
| `v1.2.3` | `v{{major}}` | `v1` |
| `v1.2.3` | `{{minor}}` | `2` |
| `v1.2.3` | `{{patch}}` | `3` |
2021-12-07 00:15:06 +08:00
| `v2.0.8-beta.67` | `{{raw}}` | `v2.0.8-beta.67` |
2021-03-29 19:04:53 +08:00
| `v2.0.8-beta.67` | `{{version}}` | `2.0.8-beta.67` |
| `v2.0.8-beta.67` | `{{major}}.{{minor}}` | `2.0.8-beta.67` * |
2021-12-07 00:15:06 +08:00
> *Pre-release (rc, beta, alpha) will only extend `{{version}}` (or `{{raw}}` if specified) as tag
> because they are updated frequently, and contain many breaking changes that are (by the author's design)
> not yet fit for public consumption.
2021-03-29 19:04:53 +08:00
Extended attributes and default values:
2020-10-25 22:13:43 +08:00
2021-03-29 19:04:53 +08:00
```yaml
tags: |
type=semver,enable=true,priority=900,prefix=,suffix=,pattern=,value=
```
2021-07-06 19:56:48 +08:00
### `type=pep440`
```yaml
tags: |
# minimal
type=pep440,pattern={{version}}
# use custom value instead of git tag
type=pep440,pattern={{version}},value=1.0.0
```
Will be used on a [push tag event ](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#push )
and requires a Git tag that conforms to [PEP 440 ](https://www.python.org/dev/peps/pep-0440/ ), but you can also use a
custom value through `value` attribute.
`pattern` attribute supports [Handlebars template ](https://handlebarsjs.com/guide/ ) with the following expressions:
* `raw` ; the actual tag
* `version` ; cleaned version
* `major` ; major version identifier
* `minor` ; minor version identifier
* `patch` ; patch version identifier
| Git tag | Pattern | Output |
|--------------------|----------------------------------------------------------|----------------------|
| `1.2.3` | `{{raw}}` | `1.2.3` |
| `1.2.3` | `{{version}}` | `1.2.3` |
| `v1.2.3` | `{{version}}` | `1.2.3` |
| `1.2.3` | `{{major}}.{{minor}}` | `1.2` |
| `1.2.3` | `v{{major}}` | `v1` |
2021-12-07 00:15:06 +08:00
| `v1.2.3rc2` | `{{raw}}` | `v1.2.3rc2` |
2021-07-06 19:56:48 +08:00
| `1.2.3rc2` | `{{version}}` | `1.2.3rc2` |
| `1.2.3rc2` | `{{major}}.{{minor}}` | `1.2.3rc2` * |
| `1.2.3post1` | `{{major}}.{{minor}}` | `1.2.3.post1` * |
| `1.2.3beta2` | `{{major}}.{{minor}}` | `1.2.3b2` * |
| `1.0dev4` | `{{major}}.{{minor}}` | `1.0.dev4` * |
2021-12-07 00:15:06 +08:00
> *dev/pre/post release will only extend `{{version}}` (or `{{raw}}` if specified) as tag
> because they are updated frequently, and contain many breaking changes that are (by the author's design)
> not yet fit for public consumption.
2021-07-06 19:56:48 +08:00
Extended attributes and default values:
```yaml
tags: |
type=pep440,enable=true,priority=900,prefix=,suffix=,pattern=,value=
```
2021-03-29 19:04:53 +08:00
### `type=match`
```yaml
tags: |
# minimal
2021-04-04 00:15:27 +08:00
type=match,pattern=\d.\d.\d
2021-03-29 19:04:53 +08:00
# define match group
type=match,pattern=v(.*),group=1
# use custom value instead of git tag
type=match,pattern=v(.*),group=1,value=v1.0.0
```
Can create a regular expression for matching Git tag with a pattern and capturing group. Will be used on a
[push tag event ](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#push ) but you can also use
a custom value through `value` attribute.
| Git tag | Pattern | Group | Output |
|-------------------------|-------------------------------|---------|------------------------|
2021-04-04 00:15:27 +08:00
| `v1.2.3` | `\d.\d.\d` | `0` | `1.2.3` |
2021-03-29 19:04:53 +08:00
| `v2.0.8-beta.67` | `v(.*)` | `1` | `2.0.8-beta.67` |
| `v2.0.8-beta.67` | `v(\d.\d)` | `1` | `2.0` |
| `20200110-RC2` | `\d+` | `0` | `20200110` |
2021-04-06 03:19:05 +08:00
| `p1/v1.2.3` | `p1-v(\d.\d.\d)` | `1` | `1.2.3` |
2021-03-29 19:04:53 +08:00
Extended attributes and default values:
```yaml
tags: |
2021-04-04 00:18:32 +08:00
type=match,enable=true,priority=800,prefix=,suffix=,pattern=,group=0,value=
2021-03-29 19:04:53 +08:00
```
### `type=edge`
```yaml
tags: |
# minimal
type=edge
# define default branch
type=edge,branch=main
```
An `edge` tag reflects the last commit of the active branch on your Git repository. I usually prefer to use `edge`
as a Docker tag for a better distinction or common pattern. This is also used by official images
like [Alpine ](https://hub.docker.com/_/alpine ).
Extended attributes and default values:
```yaml
tags: |
type=edge,enable=true,priority=700,prefix=,suffix=,branch=$repo.default_branch
```
### `type=ref`
```yaml
tags: |
2021-04-06 03:19:05 +08:00
# branch event
2021-03-29 19:04:53 +08:00
type=ref,event=branch
2021-04-06 03:19:05 +08:00
# tag event
2021-03-29 19:04:53 +08:00
type=ref,event=tag
2021-04-06 03:19:05 +08:00
# pull request event
2021-03-29 19:04:53 +08:00
type=ref,event=pr
```
This type handles Git ref (or reference) for the following events:
* `branch` ; eg. `refs/heads/master`
* `tag` ; eg. `refs/tags/v1.0.0`
* `pr` ; eg. `refs/pull/318/merge`
| Event | Ref | Output |
|-----------------|-------------------------------|-------------------------------|
| `pull_request` | `refs/pull/2/merge` | `pr-2` |
| `push` | `refs/heads/master` | `master` |
| `push` | `refs/heads/my/branch` | `my-branch` |
| `push tag` | `refs/tags/v1.2.3` | `v1.2.3` |
| `push tag` | `refs/tags/v2.0.8-beta.67` | `v2.0.8-beta.67` |
Extended attributes and default values:
```yaml
tags: |
2021-04-06 03:19:05 +08:00
# branch event
2021-07-12 23:08:07 +08:00
type=ref,enable=true,priority=600,prefix=,suffix=,event=branch
2021-04-06 03:19:05 +08:00
# tag event
2021-07-12 23:08:07 +08:00
type=ref,enable=true,priority=600,prefix=,suffix=,event=tag
2021-04-06 03:19:05 +08:00
# pull request event
2021-07-12 23:08:07 +08:00
type=ref,enable=true,priority=600,prefix=pr-,suffix=,event=pr
2021-03-29 19:04:53 +08:00
```
### `type=raw`
```yaml
tags: |
type=raw,value=foo
type=raw,value=bar
# or
type=raw,foo
type=raw,bar
# or
foo
bar
```
Output custom tags according to your needs.
Extended attributes and default values:
```yaml
tags: |
type=raw,enable=true,priority=200,prefix=,suffix=,value=
```
### `type=sha`
```yaml
tags: |
2021-05-14 03:46:07 +08:00
# minimal (short sha)
2021-05-12 02:14:23 +08:00
type=sha
# full length sha
type=sha,format=long
```
Output Git short commit (or long if specified) as Docker tag like `sha-ad132f5` .
2021-03-29 19:04:53 +08:00
Extended attributes and default values:
```yaml
tags: |
2021-05-12 02:14:23 +08:00
type=sha,enable=true,priority=100,prefix=sha-,suffix=,format=short
2021-03-29 19:04:53 +08:00
```
## Notes
### Latest tag
2020-10-25 22:13:43 +08:00
2021-03-29 19:04:53 +08:00
`latest` tag is handled through the [`flavor` input ](#flavor-input ). It will be generated by default (`auto` mode) for:
* [`type=ref,event=tag` ](#typeref )
* [`type=semver,pattern=...` ](#typesemver )
* [`type=match,pattern=...` ](#typematch )
2020-10-25 22:13:43 +08:00
2021-05-08 03:53:30 +08:00
### Global expressions
The following [Handlebars template ](https://handlebarsjs.com/guide/ ) expressions for `prefix` , `suffix` and `value`
attributes are available:
| Expression | Output |
|--------------------------|----------------------|
| `{{branch}}` | `master` |
| `{{tag}}` | `v1.2.3` |
| `{{sha}}` | `90dd603` |
2021-10-22 19:14:38 +08:00
| `{{base_ref}}` | `master` |
2021-08-20 01:58:11 +08:00
| `{{date 'YYYYMMDD'}}` | `20210326` |
2021-05-08 03:53:30 +08:00
```yaml
tags: |
# dynamically set the branch name as a prefix
type=sha,prefix={{branch}}-
# dynamically set the branch name and sha as a custom tag
type=raw,value=mytag-{{branch}}-{{sha}}
```
2021-05-08 06:01:13 +08:00
### Major version zero
Major version zero (`0.y.z`) is for initial development and **may** change at any time. This means the public API
[**should not** be considered stable ](https://semver.org/#spec-item-4 ).
In this case, Docker tag `0` **should not** be generated if you're using [`type=semver` ](#typesemver ) with `{{major}}`
pattern. You can manage this behavior like this:
```yaml
# refs/tags/v0.1.2
tags: |
# output 0.1.2
type=semver,pattern={{version}}
# output 0.1
type=semver,pattern={{major}}.{{minor}}
# disabled if major zero
type=semver,pattern={{major}},enable=${{ !startsWith(github.ref, 'refs/tags/v0.') }}
```
2021-05-23 03:23:06 +08:00
### JSON output object
The `json` output is a JSON object composed of the generated tags and labels so that you can reuse them further in your
2021-09-23 19:20:05 +08:00
workflow using the [`fromJSON` function ](https://docs.github.com/en/actions/learn-github-actions/expressions#fromjson ):
2021-05-23 03:23:06 +08:00
```yaml
-
name: Docker meta
uses: docker/metadata-action@v3
id: meta
with:
images: name/app
-
name: Build and push
uses: docker/build-push-action@v2
with:
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
```
2020-10-27 21:13:48 +08:00
### Overwrite labels
If some of the [OCI Image Format Specification ](https://github.com/opencontainers/image-spec/blob/master/annotations.md )
labels generated are not suitable, you can overwrite them like this:
```yaml
-
2020-12-24 05:09:38 +08:00
name: Docker meta
2021-05-23 03:23:06 +08:00
id: meta
2021-05-10 22:03:31 +08:00
uses: docker/metadata-action@v3
2020-10-27 21:13:48 +08:00
with:
2020-12-24 05:09:38 +08:00
images: name/app
2021-03-29 19:04:53 +08:00
labels: |
2020-12-24 05:09:38 +08:00
maintainer=CrazyMax
2020-10-27 21:13:48 +08:00
org.opencontainers.image.title=MyCustomTitle
org.opencontainers.image.description=Another description
org.opencontainers.image.vendor=MyCompany
```
2020-10-25 09:25:23 +08:00
## Keep up-to-date with GitHub Dependabot
Since [Dependabot ](https://docs.github.com/en/github/administering-a-repository/keeping-your-actions-up-to-date-with-github-dependabot )
has [native GitHub Actions support ](https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates#package-ecosystem ),
to enable it on your GitHub repo all you need to do is add the `.github/dependabot.yml` file:
```yaml
version: 2
updates:
# Maintain dependencies for GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
```