1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-01-10 03:47:03 +02:00
goreleaser/www/content/docker.md

202 lines
5.4 KiB
Markdown
Raw Normal View History

---
title: Docker
series: customization
hideFromIndex: true
weight: 140
---
Since [v0.31.0](https://github.com/goreleaser/goreleaser/releases/tag/v0.31.0),
GoReleaser supports building and pushing Docker images.
## How it works
You can declare multiple Docker images. They will be matched against
the binaries generated by your `builds` section.
If you have only one `build` setup,
the configuration is as easy as adding the
name of your image to your `.goreleaser.yml` file:
The docker image declaration supports templating. Learn more about the [name template engine](/templates).
```yaml
dockers:
- image_templates:
- user/repo
```
You also need to create a `Dockerfile` in your project's root folder:
```dockerfile
FROM scratch
COPY mybin /
ENTRYPOINT ["/mybin"]
```
This configuration will build and push a Docker image named `user/repo:tagname`.
2018-06-06 15:44:52 +02:00
> **Attention**: Note that were are not building any go files in the docker
> build phase, we are merely copying the binary to a `scratch` image and
> setting up the entrypoint.
## Customization
Of course, you can customize a lot of things:
```yaml
# .goreleaser.yml
dockers:
# You can have multiple Docker images.
-
# GOOS of the built binary that should be used.
goos: linux
# GOARCH of the built binary that should be used.
goarch: amd64
# GOARM of the built binary that should be used.
goarm: ''
# Name of the built binaries that should be used.
binaries:
- mybinary
# Templates of the Docker image names.
image_templates:
- "myuser/myimage:latest"
- "myuser/myimage:{{ .Tag }}"
- "myuser/myimage:{{ .Tag }}-{{ .Env.GO_VERSION }}"
- "myuser/myimage:v{{ .Major }}"
- "gcr.io/myuser/myimage:latest"
2018-03-24 23:42:21 +02:00
# Skips the docker push. Could be useful if you also do draft releases.
# Defaults to false.
skip_push: false
# Path to the Dockerfile (from the project root).
dockerfile: Dockerfile
# Template of the docker build flags.
build_flag_templates:
- "--label=org.label-schema.schema-version=1.0"
- "--label=org.label-schema.version={{.Version}}"
- "--label=org.label-schema.name={{.ProjectName}}"
- "--build-arg=FOO={{.ENV.Bar}}"
# If your Dockerfile copies files other than the binary itself,
# you should list them here as well.
# Note that goreleaser will create the same structure inside the temporary
# folder, so if you add `foo/bar.json` here, on your Dockerfile you can
# `COPY foo/bar.json /whatever.json`.
# Also note that the paths here are relative to the folder in which
# goreleaser is being run.
# This field does not support wildcards, you can add an entire folder here
# and use wildcards when you `COPY`/`ADD` in your Dockerfile.
extra_files:
- config.yml
```
2018-07-09 08:57:46 +02:00
> Learn more about the [name template engine](/templates).
These settings should allow you to generate multiple Docker images,
for example, using multiple `FROM` statements,
as well as generate one image for each binary in your project.
## Generic Image Names
Some users might want to keep their image name as generic as possible.
That can be accomplished simply by adding template language in the definition:
```yaml
# .goreleaser.yml
project: foo
dockers:
-
binaries:
- mybinary
image_templates:
- "myuser/{{.ProjectName}}"
```
This will build and public the following images:
- `myuser/foo`
> Learn more about the [name template engine](/templates).
2018-01-19 04:05:09 +02:00
## Keeping docker images updated for current major
Some users might want to when version to push docker tags `:v1`, `:v1.6`,
`:v1.6.4` and `:latest` when `v1.6.4` (for example) is built. That can be
accomplished by using multiple `image_templates`:
2018-01-19 04:05:09 +02:00
```yaml
# .goreleaser.yml
dockers:
-
binaries:
- mybinary
image_templates:
- "myuser/myimage:{{ .Tag }}"
- "myuser/myimage:v{{ .Major }}"
- "myuser/myimage:v{{ .Major }}.{{ .Minor }}"
- "myuser/myimage:latest"
2018-01-19 04:05:09 +02:00
```
This will build and publish the following images:
2018-06-06 15:44:52 +02:00
- `myuser/myimage:v1.6.4`
- `myuser/myimage:v1`
- `myuser/myimage:v1.6`
- `myuser/myimage:latest`
2018-01-19 04:05:09 +02:00
2018-02-19 01:37:59 +02:00
With these settings you can hopefully push several different docker images
with multiple tags.
> Learn more about the [name template engine](/templates).
## Publishing to multiple docker registries
Some users might want to push images to multiple docker registries. That can be
accomplished by using multiple `image_templates`:
```yaml
# .goreleaser.yml
dockers:
-
binaries:
- mybinary
image_templates:
- "docker.io/myuser/myimage:{{ .Tag }}"
- "docker.io/myuser/myimage:latest"
- "gcr.io/myuser/myimage:{{ .Tag }}"
- "gcr.io/myuser/myimage:latest"
```
This will build and publish the following images to `docker.io` and `gcr.io`:
- `myuser/myimage:v1.6.4`
- `myuser/myimage:latest`
## Applying docker build flags
Build flags can be applied using `build_flag_templates`. The flags must be
valid docker build flags.
```yaml
# .goreleaser.yml
dockers:
-
binaries:
- mybinary
image_templates:
- "myuser/myimage"
build_flag_templates:
- "--label=org.label-schema.schema-version=1.0"
- "--label=org.label-schema.version={{.Version}}"
- "--label=org.label-schema.name={{.ProjectName}}"
```
This will execute the following command:
```bash
docker build -t myuser/myimage . \
--label=org.label-schema.schema-version=1.0 \
--label=org.label-schema.version=1.6.4 \
--label=org.label-schema.name=mybinary"
```
> Learn more about the [name template engine](/templates).