@ -30,6 +30,7 @@ ___
* [Customizing ](#customizing )
* [Customizing ](#customizing )
* [inputs ](#inputs )
* [inputs ](#inputs )
* [outputs ](#outputs )
* [outputs ](#outputs )
* [Troubleshooting ](#troubleshooting )
* [Keep up-to-date with GitHub Dependabot ](#keep-up-to-date-with-github-dependabot )
* [Keep up-to-date with GitHub Dependabot ](#keep-up-to-date-with-github-dependabot )
* [Limitation ](#limitation )
* [Limitation ](#limitation )
@ -44,10 +45,10 @@ build-secrets, remote cache, etc. and different builder deployment/namespacing o
The default behavior of this action is to use the [Git context invoked by your workflow ](https://github.com/docker/build-push-action/blob/master/src/context.ts#L35 ).
The default behavior of this action is to use the [Git context invoked by your workflow ](https://github.com/docker/build-push-action/blob/master/src/context.ts#L35 ).
> :warning: Subdir for this context is [not yet supported ](https://github.com/docker/build-push-action/issues/120 ).
< details >
> For the moment you can use the [path context ](#path-context ).
< summary > < b > Show workflow< / b > < / summary >
```yaml
```yaml
name: ci
name: ci
on:
on:
@ -80,7 +81,8 @@ jobs:
-
-
name: Image digest
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
run: echo ${{ steps.docker_build.outputs.digest }}
```
```
< / details >
If you use this action in a private repository, you have to pass the [GitHub Token ](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token )
If you use this action in a private repository, you have to pass the [GitHub Token ](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token )
as a secret named `GIT_AUTH_TOKEN` to be able to authenticate against it with buildx:
as a secret named `GIT_AUTH_TOKEN` to be able to authenticate against it with buildx:
@ -97,126 +99,141 @@ as a secret named `GIT_AUTH_TOKEN` to be able to authenticate against it with bu
GIT_AUTH_TOKEN=${{ github.token }}
GIT_AUTH_TOKEN=${{ github.token }}
```
```
> :warning: Subdir for Git context is [not yet supported ](https://github.com/docker/build-push-action/issues/120 ).
> For the moment you can use the [path context ](#path-context ).
### Path context
### Path context
You can also use the `PATH` context alongside the [`actions/checkout` ](https://github.com/actions/checkout/ ) action.
You can also use the `PATH` context alongside the [`actions/checkout` ](https://github.com/actions/checkout/ ) action.
```yaml
< details >
name: ci
< summary > < b > Show workflow< / b > < / summary >
on:
```yaml
push:
name: ci
branches: master
on:
jobs:
push:
path-context:
branches: master
runs-on: ubuntu-latest
steps:
jobs:
-
path-context:
name: Checkout
runs-on: ubuntu-latest
uses: actions/checkout@v2
steps:
-
-
name: Set up QEMU
name: Checkout
uses: docker/setup-qemu-action@v1
uses: actions/checkout@v2
-
-
name: Set up Docker Buildx
name: Set up QEMU
uses: docker/setup-buildx-action@v1
uses: docker/setup-qemu-action@v1
-
-
name: Login to DockerHub
name: Set up Docker Buildx
uses: docker/login-action@v1
uses: docker/setup-buildx-action@v1
with:
-
username: ${{ secrets.DOCKERHUB_USERNAME }}
name: Login to DockerHub
password: ${{ secrets.DOCKERHUB_TOKEN }}
uses: docker/login-action@v1
-
with:
name: Build and push
username: ${{ secrets.DOCKERHUB_USERNAME }}
uses: docker/build-push-action@v2
password: ${{ secrets.DOCKERHUB_TOKEN }}
with:
-
context: .
name: Build and push
file: ./Dockerfile
uses: docker/build-push-action@v2
platforms: linux/amd64,linux/arm64,linux/386
with:
push: true
context: .
tags: user/app:latest
file: ./Dockerfile
```
platforms: linux/amd64,linux/arm64,linux/386
push: true
tags: user/app:latest
```
< / details >
### Isolated builders
### Isolated builders
```yaml
< details >
name: ci
< summary > < b > Show workflow< / b > < / summary >
on:
```yaml
push:
name: ci
branches: master
on:
jobs:
push:
multi-builders:
branches: master
runs-on: ubuntu-latest
steps:
jobs:
-
multi-builders:
uses: docker/setup-buildx-action@v1
runs-on: ubuntu-latest
id: builder1
steps:
-
-
uses: docker/setup-buildx-action@v1
uses: docker/setup-buildx-action@v1
id: builder2
id: builder1
-
-
name: Builder 1 name
uses: docker/setup-buildx-action@v1
run: echo ${{ steps.builder1.outputs.name }}
id: builder2
-
-
name: Builder 2 name
name: Builder 1 name
run: echo ${{ steps.builder2.outputs.name }}
run: echo ${{ steps.builder1.outputs.name }}
-
-
name: Build against builder1
name: Builder 2 name
uses: docker/build-push-action@v2
run: echo ${{ steps.builder2.outputs.name }}
with:
-
builder: ${{ steps.builder1.outputs.name }}
name: Build against builder1
target: mytarget1
uses: docker/build-push-action@v2
-
with:
name: Build against builder2
builder: ${{ steps.builder1.outputs.name }}
uses: docker/build-push-action@v2
target: mytarget1
with:
-
builder: ${{ steps.builder2.outputs.name }}
name: Build against builder2
target: mytarget2
uses: docker/build-push-action@v2
```
with:
builder: ${{ steps.builder2.outputs.name }}
target: mytarget2
```
< / details >
### Multi-platform image
### Multi-platform image
```yaml
< details >
name: ci
< summary > < b > Show workflow< / b > < / summary >
on:
```yaml
push:
name: ci
branches: master
on:
jobs:
push:
multi:
branches: master
runs-on: ubuntu-latest
steps:
jobs:
-
multi:
name: Checkout
runs-on: ubuntu-latest
uses: actions/checkout@v2
steps:
-
-
name: Set up QEMU
name: Checkout
uses: docker/setup-qemu-action@v1
uses: actions/checkout@v2
-
-
name: Set up Docker Buildx
name: Set up QEMU
uses: docker/setup-buildx-action@v1
uses: docker/setup-qemu-action@v1
-
-
name: Login to DockerHub
name: Set up Docker Buildx
uses: docker/login-action@v1
uses: docker/setup-buildx-action@v1
with:
-
username: ${{ secrets.DOCKERHUB_USERNAME }}
name: Login to DockerHub
password: ${{ secrets.DOCKERHUB_TOKEN }}
uses: docker/login-action@v1
-
with:
name: Build and push
username: ${{ secrets.DOCKERHUB_USERNAME }}
uses: docker/build-push-action@v2
password: ${{ secrets.DOCKERHUB_TOKEN }}
with:
-
context: .
name: Build and push
file: ./Dockerfile
uses: docker/build-push-action@v2
platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x
with:
push: true
context: .
tags: |
file: ./Dockerfile
user/app:latest
platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x
user/app:1.0.0
push: true
```
tags: |
user/app:latest
user/app:1.0.0
```
< / details >
## Advanced usage
## Advanced usage
@ -224,84 +241,92 @@ jobs:
For testing purposes you may need to create a [local registry ](https://hub.docker.com/_/registry ) to push images into.
For testing purposes you may need to create a [local registry ](https://hub.docker.com/_/registry ) to push images into.
```yaml
< details >
name: ci
< summary > < b > Show workflow< / b > < / summary >
on:
```yaml
push:
name: ci
branches: master
on:
jobs:
push:
local-registry:
branches: master
runs-on: ubuntu-latest
services:
jobs:
registry:
local-registry:
image: registry:2
runs-on: ubuntu-latest
ports:
services:
- 5000:5000
registry:
steps:
image: registry:2
-
ports:
name: Set up QEMU
- 5000:5000
uses: docker/setup-qemu-action@v1
steps:
-
-
name: Set up Docker Buildx
name: Set up QEMU
uses: docker/setup-buildx-action@v1
uses: docker/setup-qemu-action@v1
with:
-
driver-opts: network=host
name: Set up Docker Buildx
-
uses: docker/setup-buildx-action@v1
name: Build and push to local registry
with:
uses: docker/build-push-action@v2
driver-opts: network=host
with:
-
push: true
name: Build and push to local registry
tags: localhost:5000/name/app:latest
uses: docker/build-push-action@v2
-
with:
name: Inspect
push: true
run: |
tags: localhost:5000/name/app:latest
docker buildx imagetools inspect localhost:5000/name/app:latest
-
```
name: Inspect
run: |
docker buildx imagetools inspect localhost:5000/name/app:latest
```
< / details >
### Leverage GitHub cache
### Leverage GitHub cache
You can leverage [GitHub cache ](https://docs.github.com/en/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows )
You can leverage [GitHub cache ](https://docs.github.com/en/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows )
using [actions/cache ](https://github.com/actions/cache ) with this action.
using [actions/cache ](https://github.com/actions/cache ) with this action.
```yaml
< details >
name: ci
< summary > < b > Show workflow< / b > < / summary >
on:
```yaml
push:
name: ci
branches: master
on:
jobs:
push:
github-cache:
branches: master
runs-on: ubuntu-latest
steps:
jobs:
-
github-cache:
name: Set up Docker Buildx
runs-on: ubuntu-latest
uses: docker/setup-buildx-action@v1
steps:
-
-
name: Cache Docker layers
name: Set up Docker Buildx
uses: actions/cache@v2
uses: docker/setup-buildx-action@v1
with:
-
path: /tmp/.buildx-cache
name: Cache Docker layers
key: ${{ runner.os }}-buildx-${{ github.sha }}
uses: actions/cache@v2
restore-keys: |
with:
${{ runner.os }}-buildx-
path: /tmp/.buildx-cache
-
key: ${{ runner.os }}-buildx-${{ github.sha }}
name: Login to DockerHub
restore-keys: |
uses: docker/login-action@v1
${{ runner.os }}-buildx-
with:
-
username: ${{ secrets.DOCKERHUB_USERNAME }}
name: Login to DockerHub
password: ${{ secrets.DOCKERHUB_TOKEN }}
uses: docker/login-action@v1
-
with:
name: Build and push
username: ${{ secrets.DOCKERHUB_USERNAME }}
uses: docker/build-push-action@v2
password: ${{ secrets.DOCKERHUB_TOKEN }}
with:
-
push: true
name: Build and push
tags: user/app:latest
uses: docker/build-push-action@v2
cache-from: type=local,src=/tmp/.buildx-cache
with:
cache-to: type=local,dest=/tmp/.buildx-cache
push: true
```
tags: user/app:latest
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
```
< / details >
### Complete workflow
### Complete workflow
@ -322,88 +347,92 @@ might want to use:
| `push` | `refs/heads/my/branch` | `a5df687` | `sha-a5df687` , `my-branch` | Yes |
| `push` | `refs/heads/my/branch` | `a5df687` | `sha-a5df687` , `my-branch` | Yes |
| `push tag` | `refs/tags/v1.2.3` | | `v1.2.3` , `v1.2` , `v1` , `latest` | Yes |
| `push tag` | `refs/tags/v1.2.3` | | `v1.2.3` , `v1.2` , `v1` , `latest` | Yes |
```yaml
< details >
name: ci
< summary > < b > Show workflow< / b > < / summary >
on:
```yaml
schedule:
name: ci
- cron: '0 10 * * *' # everyday at 10am
push:
branches:
- '**'
tags:
- 'v*.*.*'
pull_request:
jobs:
on:
docker:
schedule:
runs-on: ubuntu-latest
- cron: '0 10 * * *' # everyday at 10am
steps:
push:
-
branches:
name: Checkout
- '**'
uses: actions/checkout@v2
tags:
-
- 'v*.*.*'
name: Prepare
pull_request:
id: prep
run: |
jobs:
DOCKER_IMAGE=name/app
docker:
VERSION=noop
runs-on: ubuntu-latest
if [ "${{ github.event_name }}" = "schedule" ]; then
steps:
VERSION=nightly
-
elif [[ $GITHUB_REF == refs/tags/* ]]; then
name: Checkout
VERSION=${GITHUB_REF#refs/tags/}
uses: actions/checkout@v2
elif [[ $GITHUB_REF == refs/heads/* ]]; then
-
VERSION=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's#/+#-#g')
name: Prepare
if [ "${{ github.event.repository.default_branch }}" = "$VERSION" ]; then
id: prep
VERSION=edge
run: |
DOCKER_IMAGE=name/app
VERSION=noop
if [ "${{ github.event_name }}" = "schedule" ]; then
VERSION=nightly
elif [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/}
elif [[ $GITHUB_REF == refs/heads/* ]]; then
VERSION=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's#/+#-#g')
if [ "${{ github.event.repository.default_branch }}" = "$VERSION" ]; then
VERSION=edge
fi
elif [[ $GITHUB_REF == refs/pull/* ]]; then
VERSION=pr-${{ github.event.number }}
fi
fi
elif [[ $GITHUB_REF == refs/pull/* ]]; then
TAGS="${DOCKER_IMAGE}:${VERSION}"
VERSION=pr-${{ github.event.number }}
if [[ $VERSION =~ ^v[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
fi
MINOR=${VERSION%.*}
TAGS="${DOCKER_IMAGE}:${VERSION}"
MAJOR=${MINOR%.*}
if [[ $VERSION =~ ^v[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
TAGS="$TAGS,${DOCKER_IMAGE}:${MINOR},${DOCKER_IMAGE}:${MAJOR},${DOCKER_IMAGE}:latest"
MINOR=${VERSION%.*}
elif [ "${{ github.event_name }}" = "push" ]; then
MAJOR=${MINOR%.*}
TAGS="$TAGS,${DOCKER_IMAGE}:sha-${GITHUB_SHA::8}"
TAGS="$TAGS,${DOCKER_IMAGE}:${MINOR},${DOCKER_IMAGE}:${MAJOR},${DOCKER_IMAGE}:latest"
fi
elif [ "${{ github.event_name }}" = "push" ]; then
echo ::set-output name=version::${VERSION}
TAGS="$TAGS,${DOCKER_IMAGE}:sha-${GITHUB_SHA::8}"
echo ::set-output name=tags::${TAGS}
fi
echo ::set-output name=created::$(date -u +'%Y-%m-%dT%H:%M:%SZ')
echo ::set-output name=version::${VERSION}
-
echo ::set-output name=tags::${TAGS}
name: Set up QEMU
echo ::set-output name=created::$(date -u +'%Y-%m-%dT%H:%M:%SZ')
uses: docker/setup-qemu-action@v1
-
-
name: Set up QEMU
name: Set up Docker Buildx
uses: docker/setup-qemu-action@v1
uses: docker/setup-buildx-action@v1
-
-
name: Set up Docker Buildx
name: Login to DockerHub
uses: docker/setup-buildx-action@v1
if: github.event_name != 'pull_request'
-
uses: docker/login-action@v1
name: Login to DockerHub
with:
if: github.event_name != 'pull_request'
username: ${{ secrets.DOCKERHUB_USERNAME }}
uses: docker/login-action@v1
password: ${{ secrets.DOCKERHUB_TOKEN }}
with:
-
username: ${{ secrets.DOCKERHUB_USERNAME }}
name: Build and push
password: ${{ secrets.DOCKERHUB_TOKEN }}
id: docker_build
-
uses: docker/build-push-action@v2
name: Build and push
with:
id: docker_build
context: .
uses: docker/build-push-action@v2
file: ./Dockerfile
with:
platforms: linux/amd64,linux/arm64,linux/386
context: .
push: ${{ github.event_name != 'pull_request' }}
file: ./Dockerfile
tags: ${{ steps.prep.outputs.tags }}
platforms: linux/amd64,linux/arm64,linux/386
labels: |
push: ${{ github.event_name != 'pull_request' }}
org.opencontainers.image.title=${{ github.event.repository.name }}
tags: ${{ steps.prep.outputs.tags }}
org.opencontainers.image.description=${{ github.event.repository.description }}
labels: |
org.opencontainers.image.url=${{ github.event.repository.html_url }}
org.opencontainers.image.title=${{ github.event.repository.name }}
org.opencontainers.image.source=${{ github.event.repository.clone_url }}
org.opencontainers.image.description=${{ github.event.repository.description }}
org.opencontainers.image.version=${{ steps.prep.outputs.version }}
org.opencontainers.image.url=${{ github.event.repository.html_url }}
org.opencontainers.image.created=${{ steps.prep.outputs.created }}
org.opencontainers.image.source=${{ github.event.repository.clone_url }}
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.version=${{ steps.prep.outputs.version }}
org.opencontainers.image.licenses=${{ github.event.repository.license.spdx_id }}
org.opencontainers.image.created=${{ steps.prep.outputs.created }}
```
org.opencontainers.image.revision=${{ github.sha }}
< / details >
org.opencontainers.image.licenses=${{ github.event.repository.license.spdx_id }}
```
### Update DockerHub repo description
### Update DockerHub repo description
@ -411,43 +440,47 @@ You can update the [Docker Hub repository description](https://docs.docker.com/d
a third-party action called [Docker Hub Description ](https://github.com/peter-evans/dockerhub-description )
a third-party action called [Docker Hub Description ](https://github.com/peter-evans/dockerhub-description )
with this action.
with this action.
```yaml
< details >
name: ci
< summary > < b > Show workflow< / b > < / summary >
on:
```yaml
push:
name: ci
branches: master
on:
jobs:
push:
main:
branches: master
runs-on: ubuntu-latest
steps:
jobs:
-
main:
name: Set up QEMU
runs-on: ubuntu-latest
uses: docker/setup-qemu-action@v1
steps:
-
-
name: Set up Docker Buildx
name: Set up QEMU
uses: docker/setup-buildx-action@v1
uses: docker/setup-qemu-action@v1
-
-
name: Login to DockerHub
name: Set up Docker Buildx
uses: docker/login-action@v1
uses: docker/setup-buildx-action@v1
with:
-
username: ${{ secrets.DOCKERHUB_USERNAME }}
name: Login to DockerHub
password: ${{ secrets.DOCKERHUB_TOKEN }}
uses: docker/login-action@v1
-
with:
name: Build and push
username: ${{ secrets.DOCKERHUB_USERNAME }}
uses: docker/build-push-action@v2
password: ${{ secrets.DOCKERHUB_TOKEN }}
with:
-
push: true
name: Build and push
tags: user/app:latest
uses: docker/build-push-action@v2
-
with:
name: Update repo description
push: true
uses: peter-evans/dockerhub-description@v2
tags: user/app:latest
env:
-
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
name: Update repo description
DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
uses: peter-evans/dockerhub-description@v2
DOCKERHUB_REPOSITORY: user/app
env:
```
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
DOCKERHUB_REPOSITORY: user/app
```
< / details >
## Customizing
## Customizing
@ -503,6 +536,10 @@ Following outputs are available
|---------------|---------|---------------------------------------|
|---------------|---------|---------------------------------------|
| `digest` | String | Image content-addressable identifier also called a digest |
| `digest` | String | Image content-addressable identifier also called a digest |
## Troubleshooting
See [TROUBLESHOOTING.md ](TROUBLESHOOTING.md )
## Keep up-to-date with GitHub Dependabot
## 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 )
Since [Dependabot ](https://docs.github.com/en/github/administering-a-repository/keeping-your-actions-up-to-date-with-github-dependabot )