Repository: crazy-max/diun
Pull request #476 (2021-08-26 06:18:59)

Bump github.com/containers/image/v5 from 5.15.2 to 5.16.0
Bumps [github.com/containers/image/v5](https://github.com/containers/image) from 5.15.2 to 5.16.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/containers/image/releases">github.com/containers/image/v5's releases</a>.</em></p>
<blockquote>
<h2>v5.16.0</h2>
<ul>
<li>Don't cancel a mpb.Progress using a context</li>
<li>Don't recompress non-gzip data without an explicit request</li>
<li>accept identity tokens from credential helpers</li>
<li>Add codespell fixes</li>
<li>Don't initialize a digest.Canonical.Digester if it is not necessary</li>
<li>Don't compute the (compressed) digest in PutBlob if the caller provides it</li>
<li>Don't call digest.Digester.Hash() on every digeringReader.Read()</li>
<li>Pass OriginalDigest and UncompressedDigest to c/storage.Store.PutLayer</li>
<li>Document that PutBlob callers must only provide validated digests</li>
<li>Consistently compare docker.Digest with &quot;&quot; without Digest.String()</li>
<li>Don't unnecessarily compute the blob digest in PutBlob</li>
<li>copy.Options: semaphore to limit parallel pulls globally</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/containers/image/commit/3ed4f40160d306006741bac0005985d6b1f88c60"><code>3ed4f40</code></a> v5.16.0</li>
<li><a href="https://github.com/containers/image/commit/17bb73ddbdf60b53de34c9303c3bbec1eecce604"><code>17bb73d</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/containers/image/issues/1359">#1359</a> from giuseppe/partial-support-200-ret-code</li>
<li><a href="https://github.com/containers/image/commit/ea19c43cf0568f7d675edfe2e77b6a2da6e59d79"><code>ea19c43</code></a> docker: convert fully body to partial requests</li>
<li><a href="https://github.com/containers/image/commit/9548c6c7d1c129ac148936812512d088ebe0a8ed"><code>9548c6c</code></a> types: document GetBlobAt chunks assumption</li>
<li><a href="https://github.com/containers/image/commit/d6f64a2fa958c5e464d5d840a147e879d993bdb4"><code>d6f64a2</code></a> Fix build issues</li>
<li><a href="https://github.com/containers/image/commit/7ebb64a4d05535ed37f3e026fa8c22983c6861ef"><code>7ebb64a</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/containers/image/issues/1360">#1360</a> from rhatdan/vendor</li>
<li><a href="https://github.com/containers/image/commit/3edecab518219f7b3a246393a5c1174a81af8346"><code>3edecab</code></a> Vendor in containers/storage v1.35.0</li>
<li><a href="https://github.com/containers/image/commit/91c7fe72fc273c261cd618b441bd73e6c04e73a4"><code>91c7fe7</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/containers/image/issues/1356">#1356</a> from vrothberg/global-semaphore</li>
<li><a href="https://github.com/containers/image/commit/c920363a36126a1c4b69462dcef9e9910bcf57ff"><code>c920363</code></a> copy.Options: semaphore to limit parallel pulls globaly</li>
<li><a href="https://github.com/containers/image/commit/a50fcf25d44c26c1ae0e0cb35374626d58b8036e"><code>a50fcf2</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/containers/image/issues/1357">#1357</a> from mtrmac/mpb</li>
<li>Additional commits viewable in <a href="https://github.com/containers/image/compare/v5.15.2...v5.16.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/containers/image/v5&package-manager=go_modules&previous-version=5.15.2&new-version=5.16.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 55897785..d41e43a6 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -132,7 +132,7 @@ jobs:
           path: ./dist/*
           if-no-files-found: error
       -
-        name: Build
+        name: Build image
         uses: docker/bake-action@v1
         with:
           files: |
diff --git a/codecov.yml b/codecov.yml
new file mode 100644
index 00000000..dc46984e
--- /dev/null
+++ b/codecov.yml
@@ -0,0 +1,3 @@
+comment: false
+github_checks:
+  annotations: false
diff --git a/docs/providers/docker.md b/docs/providers/docker.md
index a917db41..d5e0323c 100644
--- a/docs/providers/docker.md
+++ b/docs/providers/docker.md
@@ -177,7 +177,8 @@ You can configure more finely the way to analyze the image of your container thr
 | `diun.enable`                 |               | Set to true to enable image analysis of this container |
 | `diun.regopt`                 |               | [Registry options](../config/regopts.md) name to use |
 | `diun.watch_repo`             | `false`       | Watch all tags of this container image ([be careful](../faq.md#docker-hub-rate-limits) with this setting) |
+| `diun.notify_on`              | `new;update`  | Semicolon separated list of status to be notified: `new`, `update`. |
 | `diun.max_tags`               | `0`           | Maximum number of tags to watch if `diun.watch_repo` enabled. `0` means all of them |
-| `diun.include_tags`           |               | Semi-colon separated list of regular expressions to include tags. Can be useful if you enable `diun.watch_repo` |
-| `diun.exclude_tags`           |               | Semi-colon separated list of regular expressions to exclude tags. Can be useful if you enable `diun.watch_repo` |
+| `diun.include_tags`           |               | Semicolon separated list of regular expressions to include tags. Can be useful if you enable `diun.watch_repo` |
+| `diun.exclude_tags`           |               | Semicolon separated list of regular expressions to exclude tags. Can be useful if you enable `diun.watch_repo` |
 | `diun.platform`               | _automatic_   | Platform to use (e.g. `linux/amd64`) |
diff --git a/docs/providers/dockerfile.md b/docs/providers/dockerfile.md
index 7804229f..a6eb0aa4 100644
--- a/docs/providers/dockerfile.md
+++ b/docs/providers/dockerfile.md
@@ -110,7 +110,8 @@ The following annotations can be added as comments before the target instruction
 |-------------------------------|---------------|---------------|
 | `diun.regopt`                 |               | [Registry options](../config/regopts.md) name to use |
 | `diun.watch_repo`             | `false`       | Watch all tags of this image |
+| `diun.notify_on`              | `new;update`  | Semicolon separated list of status to be notified: `new`, `update`. |
 | `diun.max_tags`               | `0`           | Maximum number of tags to watch if `watch_repo` enabled. `0` means all of them |
-| `diun.include_tags`           |               | Semi-colon separated list of regular expressions to include tags. Can be useful if you enable `diun.watch_repo` |
-| `diun.exclude_tags`           |               | Semi-colon separated list of regular expressions to exclude tags. Can be useful if you enable `diun.watch_repo` |
+| `diun.include_tags`           |               | Semicolon separated list of regular expressions to include tags. Can be useful if you enable `diun.watch_repo` |
+| `diun.exclude_tags`           |               | Semicolon separated list of regular expressions to exclude tags. Can be useful if you enable `diun.watch_repo` |
 | `diun.platform`               | _automatic_   | Platform to use (e.g. `linux/amd64`) |
diff --git a/docs/providers/file.md b/docs/providers/file.md
index 16689e63..5e122b43 100644
--- a/docs/providers/file.md
+++ b/docs/providers/file.md
@@ -52,9 +52,11 @@ providers:
 
 # Watch crazymax/swarm-cronjob image and assume docker.io registry and latest tag
 # with registry options named 'docker.io/crazymax' (image selector).
-# Only include tags matching regexp ^1\.2\..*
+# Only include tags matching regexp ^1\.2\..* and only be notified on new tag.
 - name: crazymax/swarm-cronjob
   watch_repo: true
+  notify_on:
+    - new
   include_tags:
     - ^1\.2\..*
 
@@ -175,6 +177,7 @@ The configuration file(s) defines a slice of images to analyze with the followin
 | `name`                        | `latest`                         | Docker image name to watch using `registry/path:tag` format. If registry omitted, `docker.io` will be used and if tag omitted, `latest` will be used |
 | `regopt`                      |                                  | [Registry options](../config/regopts.md) name to use |
 | `watch_repo`                  | `false`                          | Watch all tags of this image ([be careful](../faq.md#docker-hub-rate-limits) with this setting) |
+| `notify_on`                   | `new;update`                     | Semicolon separated list of status to be notified: `new`, `update`. |
 | `max_tags`                    | `0`                              | Maximum number of tags to watch if `watch_repo` enabled. `0` means all of them |
 | `include_tags`                |                                  | List of regular expressions to include tags. Can be useful if you enable `watch_repo` |
 | `exclude_tags`                |                                  | List of regular expressions to exclude tags. Can be useful if you enable `watch_repo` |
diff --git a/docs/providers/kubernetes.md b/docs/providers/kubernetes.md
index dd3fcc76..7d89d23c 100644
--- a/docs/providers/kubernetes.md
+++ b/docs/providers/kubernetes.md
@@ -286,7 +286,8 @@ You can configure more finely the way to analyze the image of your pods through
 | `diun.enable`                 |               | Set to true to enable image analysis of this pod |
 | `diun.regopt`                 |               | [Registry options](../config/regopts.md) name to use |
 | `diun.watch_repo`             | `false`       | Watch all tags of this pod image ([be careful](../faq.md#docker-hub-rate-limits) with this setting) |
+| `diun.notify_on`              | `new;update`  | Semicolon separated list of status to be notified: `new`, `update`. |
 | `diun.max_tags`               | `0`           | Maximum number of tags to watch if `diun.watch_repo` enabled. `0` means all of them |
-| `diun.include_tags`           |               | Semi-colon separated list of regular expressions to include tags. Can be useful if you enable `diun.watch_repo` |
-| `diun.exclude_tags`           |               | Semi-colon separated list of regular expressions to exclude tags. Can be useful if you enable `diun.watch_repo` |
+| `diun.include_tags`           |               | Semicolon separated list of regular expressions to include tags. Can be useful if you enable `diun.watch_repo` |
+| `diun.exclude_tags`           |               | Semicolon separated list of regular expressions to exclude tags. Can be useful if you enable `diun.watch_repo` |
 | `diun.platform`               | _automatic_   | Platform to use (e.g. `linux/amd64`) |
diff --git a/docs/providers/swarm.md b/docs/providers/swarm.md
index 9d707451..4e767f1c 100644
--- a/docs/providers/swarm.md
+++ b/docs/providers/swarm.md
@@ -180,7 +180,8 @@ You can configure more finely the way to analyze the image of your service throu
 | `diun.enable`                 |               | Set to true to enable image analysis of this service |
 | `diun.regopt`                 |               | [Registry options](../config/regopts.md) name to use |
 | `diun.watch_repo`             | `false`       | Watch all tags of this service image ([be careful](../faq.md#docker-hub-rate-limits) with this setting) |
+| `diun.notify_on`              | `new;update`  | Semicolon separated list of status to be notified: `new`, `update`. |
 | `diun.max_tags`               | `0`           | Maximum number of tags to watch if `diun.watch_repo` enabled. `0` means all of them |
-| `diun.include_tags`           |               | Semi-colon separated list of regular expressions to include tags. Can be useful if you enable `diun.watch_repo` |
-| `diun.exclude_tags`           |               | Semi-colon separated list of regular expressions to exclude tags. Can be useful if you enable `diun.watch_repo` |
+| `diun.include_tags`           |               | Semicolon separated list of regular expressions to include tags. Can be useful if you enable `diun.watch_repo` |
+| `diun.exclude_tags`           |               | Semicolon separated list of regular expressions to exclude tags. Can be useful if you enable `diun.watch_repo` |
 | `diun.platform`               | _automatic_   | Platform to use (e.g. `linux/amd64`) |
diff --git a/go.mod b/go.mod
index 737d38ae..689bc57e 100644
--- a/go.mod
+++ b/go.mod
@@ -18,10 +18,10 @@ require (
 	github.com/cespare/xxhash/v2 v2.1.1 // indirect
 	github.com/containerd/containerd v1.5.5
 	github.com/containerd/typeurl v1.0.2 // indirect
-	github.com/containers/image/v5 v5.15.2
+	github.com/containers/image/v5 v5.16.0
 	github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b // indirect
 	github.com/containers/ocicrypt v1.1.2 // indirect
-	github.com/containers/storage v1.34.1 // indirect
+	github.com/containers/storage v1.35.0 // indirect
 	github.com/crazy-max/gohealthchecks v0.3.0
 	github.com/crazy-max/gonfig v0.5.0
 	github.com/davecgh/go-spew v1.1.1 // indirect
@@ -75,7 +75,7 @@ require (
 	github.com/olekukonko/tablewriter v0.0.1 // indirect
 	github.com/opencontainers/go-digest v1.0.0
 	github.com/opencontainers/image-spec v1.0.2-0.20210819154149-5ad6f50d6283
-	github.com/opencontainers/runc v1.0.1 // indirect
+	github.com/opencontainers/runc v1.0.2 // indirect
 	github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect
 	github.com/panjf2000/ants/v2 v2.4.6
 	github.com/pkg/errors v0.9.1
@@ -100,12 +100,12 @@ require (
 	github.com/ulikunitz/xz v0.5.10 // indirect
 	github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04 // indirect
 	github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe // indirect
-	github.com/vbatts/tar-split v0.11.1 // indirect
+	github.com/vbatts/tar-split v0.11.2 // indirect
 	go.etcd.io/bbolt v1.3.6
 	golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
 	golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect
 	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
-	golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 // indirect
+	golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 // indirect
 	golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect
 	golang.org/x/text v0.3.6 // indirect
 	golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
diff --git a/go.sum b/go.sum
index cf775661..fdbdf7a8 100644
--- a/go.sum
+++ b/go.sum
@@ -337,8 +337,8 @@ github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ
 github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
 github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM=
 github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8=
-github.com/containers/image/v5 v5.15.2 h1:DKicmVr0h1HGkzs9muoErX+fVbV9sV9W5TyMy5perLE=
-github.com/containers/image/v5 v5.15.2/go.mod h1:8jejVSzTDfyPwr/HXp9rri34n/vbdavYk6IzTiB3TBw=
+github.com/containers/image/v5 v5.16.0 h1:WQcNSzb7+ngS2cfynx0vUwhk+scpgiKlldVcsF8GPbI=
+github.com/containers/image/v5 v5.16.0/go.mod h1:XgTpfAPLRGOd1XYyCU5cISFr777bLmOerCSpt/v7+Q4=
 github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b h1:Q8ePgVfHDplZ7U33NwHZkrVELsZP5fYj9pM5WBZB2GE=
 github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY=
 github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc=
@@ -346,8 +346,8 @@ github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgU
 github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY=
 github.com/containers/ocicrypt v1.1.2 h1:Ez+GAMP/4GLix5Ywo/fL7O0nY771gsBIigiqUm1aXz0=
 github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY=
-github.com/containers/storage v1.34.1 h1:PsBGMH7hwuQ3MOr7qTgPznFrE8ebfIbwQbg2gKvg0lE=
-github.com/containers/storage v1.34.1/go.mod h1:FY2TcbfgCLMU4lYoKnlZeZXeH353TOTbpDEA+sAcqAY=
+github.com/containers/storage v1.35.0 h1:bNduWshYm1tq4IPJRC+zLs3VQ+1tbauU0CZBaqzPxw4=
+github.com/containers/storage v1.35.0/go.mod h1:qzYhasQP2/V9D9XdO+vRwkHBhsBO0oznMLzzRDQ8s20=
 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
@@ -408,7 +408,6 @@ github.com/docker/docker v0.0.0-20200511152416-a93e9eb0e95c/go.mod h1:eEKB0N0r5N
 github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker v1.4.2-0.20180531152204-71cd53e4a197/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/docker v1.4.2-0.20191219165747-a9416c67da9f/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker v17.12.0-ce-rc1.0.20200730172259-9f28837c1d93+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker v20.10.0-beta1.0.20201110211921-af34b94a78a1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker v20.10.3-0.20210609071616-4c2ec79bf2a8+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
@@ -967,7 +966,6 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8
 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
 github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
-github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
 github.com/opencontainers/image-spec v1.0.2-0.20210819154149-5ad6f50d6283 h1:TVzvdjOalkJBNkbpPVMAr4KV9QRf2IjfxdyxwAK78Gs=
 github.com/opencontainers/image-spec v1.0.2-0.20210819154149-5ad6f50d6283/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
 github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
@@ -977,8 +975,9 @@ github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h
 github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE=
 github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0=
-github.com/opencontainers/runc v1.0.1 h1:G18PGckGdAm3yVQRWDVQ1rLSLntiniKJ0cNRT2Tm5gs=
 github.com/opencontainers/runc v1.0.1/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=
+github.com/opencontainers/runc v1.0.2 h1:opHZMaswlyxz1OuGpBE53Dwe4/xF7EZTY0A2L/FpCOg=
+github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=
 github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
@@ -1212,6 +1211,7 @@ github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/
 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s=
@@ -1221,9 +1221,9 @@ github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04 h1:L0rPdfzq43+NV8rfIx
 github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04/go.mod h1:tcnB1voG49QhCrwq1W0w5hhGasvOg+VQp9i9H1rCM1w=
 github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe h1:9YnI5plmy+ad6BM+JCLJb2ZV7/TNiE5l7SNKfumYKgc=
 github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe/go.mod h1:JTFJA/t820uFDoyPpErFQ3rb3amdZoPtxcKervG0OE4=
-github.com/vbatts/tar-split v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE=
-github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g=
-github.com/vbauerster/mpb/v7 v7.0.3/go.mod h1:NXGsfPGx6G2JssqvEcULtDqUrxuuYs4llpv8W6ZUpzk=
+github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME=
+github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI=
+github.com/vbauerster/mpb/v7 v7.1.3/go.mod h1:X5GlohZw2fIpypMXWaKart+HGSAjpz49skxkDk+ZL7c=
 github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c=
 github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
 github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
@@ -1520,8 +1520,10 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 h1:siQdpVirKtzPhKl3lZWozZraCFObP8S1v6PRp0bLrtU=
 golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 h1:rw6UNGRMfarCepjI8qOepea/SXwIBVfTKjztZ5gBbq4=
+golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
diff --git a/internal/app/job.go b/internal/app/job.go
index 59aa3dab..fc0b81f3 100644
--- a/internal/app/job.go
+++ b/internal/app/job.go
@@ -102,7 +102,7 @@ func (di *Diun) createJob(job model.Job) {
 		InsecureTLS:   *reg.InsecureTLS,
 		UserAgent:     di.meta.UserAgent,
 		CompareDigest: *di.cfg.Watch.CompareDigest,
-		ImageOs:       job.Image.Platform.Os,
+		ImageOs:       job.Image.Platform.OS,
 		ImageArch:     job.Image.Platform.Arch,
 		ImageVariant:  job.Image.Platform.Variant,
 	})
@@ -222,6 +222,12 @@ func (di *Diun) runJob(job model.Job) (entry model.NotifEntry) {
 		return
 	}
 
+	notifyOn := model.NotifyOn(entry.Status)
+	if !notifyOn.OneOf(job.Image.NotifyOn) {
+		sublog.Debug().Msgf("Skipping notification (%s not part of specified notify status)", entry.Status)
+		return
+	}
+
 	di.notif.Send(entry)
 	return
 }
diff --git a/internal/model/image.go b/internal/model/image.go
index c410d506..95a66b8f 100644
--- a/internal/model/image.go
+++ b/internal/model/image.go
@@ -6,6 +6,7 @@ type Image struct {
 	Platform    ImagePlatform `yaml:"platform,omitempty" json:",omitempty"`
 	RegOpt      string        `yaml:"regopt,omitempty" json:",omitempty"`
 	WatchRepo   bool          `yaml:"watch_repo,omitempty" json:",omitempty"`
+	NotifyOn    []NotifyOn    `yaml:"notify_on,omitempty" json:",omitempty"`
 	MaxTags     int           `yaml:"max_tags,omitempty" json:",omitempty"`
 	IncludeTags []string      `yaml:"include_tags,omitempty" json:",omitempty"`
 	ExcludeTags []string      `yaml:"exclude_tags,omitempty" json:",omitempty"`
@@ -14,12 +15,12 @@ type Image struct {
 
 // ImagePlatform holds image platform configuration
 type ImagePlatform struct {
-	Os      string `yaml:"os,omitempty" json:",omitempty"`
+	OS      string `yaml:"os,omitempty" json:",omitempty"`
 	Arch    string `yaml:"arch,omitempty" json:",omitempty"`
 	Variant string `yaml:"variant,omitempty" json:",omitempty"`
 }
 
-// Image status constants
+// ImageStatus constants
 const (
 	ImageStatusNew      = ImageStatus("new")
 	ImageStatusUpdate   = ImageStatus("update")
@@ -30,3 +31,33 @@ const (
 
 // ImageStatus holds Docker image status analysis
 type ImageStatus string
+
+// NotifyOn constants
+const (
+	NotifyOnNew    = NotifyOn(ImageStatusNew)
+	NotifyOnUpdate = NotifyOn(ImageStatusUpdate)
+)
+
+// NotifyOn holds notify status type
+type NotifyOn string
+
+// NotifyOnDefaults are the default notify status
+var NotifyOnDefaults = []NotifyOn{
+	NotifyOnNew,
+	NotifyOnUpdate,
+}
+
+// Valid checks notify status is valid
+func (ns *NotifyOn) Valid() bool {
+	return ns.OneOf(NotifyOnDefaults)
+}
+
+// OneOf checks if notify status is one of the values in the list
+func (ns *NotifyOn) OneOf(nsl []NotifyOn) bool {
+	for _, n := range nsl {
+		if n == *ns {
+			return true
+		}
+	}
+	return false
+}
diff --git a/internal/provider/common.go b/internal/provider/common.go
index 4aa6ed71..ffeeef92 100644
--- a/internal/provider/common.go
+++ b/internal/provider/common.go
@@ -15,7 +15,8 @@ func ValidateImage(image string, labels map[string]string, watchByDef bool) (img
 		image = image[:i]
 	}
 	img = model.Image{
-		Name: image,
+		Name:     image,
+		NotifyOn: model.NotifyOnDefaults,
 	}
 
 	if enableStr, ok := labels["diun.enable"]; ok {
@@ -38,6 +39,18 @@ func ValidateImage(image string, labels map[string]string, watchByDef bool) (img
 			if img.WatchRepo, err = strconv.ParseBool(value); err != nil {
 				return img, fmt.Errorf("cannot parse %s value of label %s", value, key)
 			}
+		case "diun.notify_on":
+			if len(value) == 0 {
+				break
+			}
+			img.NotifyOn = []model.NotifyOn{}
+			for _, no := range strings.Split(value, ";") {
+				notifyOn := model.NotifyOn(no)
+				if !notifyOn.Valid() {
+					return img, fmt.Errorf("unknown notify status %q", value)
+				}
+				img.NotifyOn = append(img.NotifyOn, notifyOn)
+			}
 		case "diun.max_tags":
 			if img.MaxTags, err = strconv.Atoi(value); err != nil {
 				return img, fmt.Errorf("cannot parse %s value of label %s", value, key)
@@ -54,7 +67,7 @@ func ValidateImage(image string, labels map[string]string, watchByDef bool) (img
 				return img, fmt.Errorf("cannot parse %s platform of label %s", value, key)
 			}
 			img.Platform = model.ImagePlatform{
-				Os:      platform.OS,
+				OS:      platform.OS,
 				Arch:    platform.Architecture,
 				Variant: platform.Variant,
 			}
diff --git a/internal/provider/file/fixtures/bintray.yml b/internal/provider/file/fixtures/bintray.yml
index 3f9efd1a..6b9cdd76 100644
--- a/internal/provider/file/fixtures/bintray.yml
+++ b/internal/provider/file/fixtures/bintray.yml
@@ -2,4 +2,6 @@
   regopt: bintrayoptions
 - name: docker.bintray.io/jfrog/xray-server:2.8.6
   watch_repo: true
+  notify_on:
+    - new
   max_tags: 50
diff --git a/internal/provider/file/image.go b/internal/provider/file/image.go
index 5368b449..ff83c6d4 100644
--- a/internal/provider/file/image.go
+++ b/internal/provider/file/image.go
@@ -5,7 +5,9 @@ import (
 	"path/filepath"
 	"strings"
 
+	"github.com/containerd/containerd/platforms"
 	"github.com/crazy-max/diun/v4/internal/model"
+	ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
 	"gopkg.in/yaml.v2"
 )
 
@@ -28,7 +30,43 @@ func (c *Client) listFileImage() []model.Image {
 			c.logger.Error().Err(err).Msgf("Unable to decode into struct %s", file)
 			continue
 		}
-		images = append(images, items...)
+		for _, item := range items {
+
+			// Check NotifyOn
+			if len(item.NotifyOn) == 0 {
+				item.NotifyOn = model.NotifyOnDefaults
+			} else {
+				for _, no := range item.NotifyOn {
+					if !no.Valid() {
+						c.logger.Error().
+							Str("file", file).
+							Str("img_name", item.Name).
+							Msgf("unknown notify status %q", no)
+					}
+				}
+			}
+
+			// Check Platform
+			if item.Platform != (model.ImagePlatform{}) {
+				_, err = platforms.Parse(platforms.Format(ocispecs.Platform{
+					OS:           item.Platform.OS,
+					Architecture: item.Platform.Arch,
+					Variant:      item.Platform.Variant,
+				}))
+				if err != nil {
+					c.logger.Error().
+						Str("file", file).
+						Str("img_name", item.Name).
+						Msgf("cannot parse %s platform", platforms.Format(ocispecs.Platform{
+							OS:           item.Platform.OS,
+							Architecture: item.Platform.Arch,
+							Variant:      item.Platform.Variant,
+						}))
+				}
+			}
+
+			images = append(images, item)
+		}
 	}
 
 	return images


Test patch:
diff --git a/hack/test.Dockerfile b/hack/test.Dockerfile
index 9db38b15..49b42983 100644
--- a/hack/test.Dockerfile
+++ b/hack/test.Dockerfile
@@ -14,7 +14,8 @@ FROM gomod AS test
 RUN --mount=type=bind,target=. \
   --mount=type=cache,target=/go/pkg/mod \
   --mount=type=cache,target=/root/.cache/go-build \
-  go test -v -coverprofile=/tmp/coverage.txt -covermode=atomic -race ./...
+  go test -v -coverprofile=/tmp/coverage.txt -covermode=atomic -race ./... && \
+  go tool cover -func=/tmp/coverage.txt
 
 FROM scratch AS test-coverage
 COPY --from=test /tmp/coverage.txt /coverage.txt
diff --git a/internal/provider/file/file_test.go b/internal/provider/file/file_test.go
index 1ef059eb..9109aee0 100644
--- a/internal/provider/file/file_test.go
+++ b/internal/provider/file/file_test.go
@@ -13,8 +13,9 @@ var (
 		{
 			Provider: "file",
 			Image: model.Image{
-				Name:   "jfrog-docker-reg2.bintray.io/jfrog/artifactory-oss:4.0.0",
-				RegOpt: "bintrayoptions",
+				Name:     "jfrog-docker-reg2.bintray.io/jfrog/artifactory-oss:4.0.0",
+				RegOpt:   "bintrayoptions",
+				NotifyOn: model.NotifyOnDefaults,
 			},
 		},
 		{
@@ -22,7 +23,10 @@ var (
 			Image: model.Image{
 				Name:      "docker.bintray.io/jfrog/xray-server:2.8.6",
 				WatchRepo: true,
-				MaxTags:   50,
+				NotifyOn: []model.NotifyOn{
+					model.NotifyOnNew,
+				},
+				MaxTags: 50,
 			},
 		},
 	}
@@ -30,8 +34,9 @@ var (
 		{
 			Provider: "file",
 			Image: model.Image{
-				Name:   "docker.io/crazymax/nextcloud:latest",
-				RegOpt: "myregistry",
+				Name:     "docker.io/crazymax/nextcloud:latest",
+				RegOpt:   "myregistry",
+				NotifyOn: model.NotifyOnDefaults,
 			},
 		},
 		{
@@ -39,6 +44,7 @@ var (
 			Image: model.Image{
 				Name:      "crazymax/swarm-cronjob",
 				WatchRepo: true,
+				NotifyOn:  model.NotifyOnDefaults,
 				IncludeTags: []string{
 					`^1\.2\..*`,
 				},
@@ -49,6 +55,7 @@ var (
 			Image: model.Image{
 				Name:      "docker.io/portainer/portainer",
 				WatchRepo: true,
+				NotifyOn:  model.NotifyOnDefaults,
 				MaxTags:   10,
 				IncludeTags: []string{
 					`^(0|[1-9]\d*)\..*`,
@@ -60,14 +67,16 @@ var (
 			Image: model.Image{
 				Name:      "traefik",
 				WatchRepo: true,
+				NotifyOn:  model.NotifyOnDefaults,
 			},
 		},
 		{
 			Provider: "file",
 			Image: model.Image{
-				Name: "alpine",
+				Name:     "alpine",
+				NotifyOn: model.NotifyOnDefaults,
 				Platform: model.ImagePlatform{
-					Os:      "linux",
+					OS:      "linux",
 					Arch:    "arm64",
 					Variant: "v8",
 				},
@@ -76,13 +85,15 @@ var (
 		{
 			Provider: "file",
 			Image: model.Image{
-				Name: "docker.io/graylog/graylog:3.2.0",
+				Name:     "docker.io/graylog/graylog:3.2.0",
+				NotifyOn: model.NotifyOnDefaults,
 			},
 		},
 		{
 			Provider: "file",
 			Image: model.Image{
-				Name: "jacobalberty/unifi:5.9",
+				Name:     "jacobalberty/unifi:5.9",
+				NotifyOn: model.NotifyOnDefaults,
 			},
 		},
 		{
@@ -90,6 +101,7 @@ var (
 			Image: model.Image{
 				Name:      "crazymax/ddns-route53",
 				WatchRepo: true,
+				NotifyOn:  model.NotifyOnDefaults,
 				IncludeTags: []string{
 					`^1\..*`,
 				},
@@ -100,13 +112,15 @@ var (
 		{
 			Provider: "file",
 			Image: model.Image{
-				Name: "quay.io/coreos/hyperkube",
+				Name:     "quay.io/coreos/hyperkube",
+				NotifyOn: model.NotifyOnDefaults,
 			},
 		},
 		{
 			Provider: "file",
 			Image: model.Image{
-				Name: "quay.io/coreos/hyperkube:v1.1.7-coreos.1",
+				Name:     "quay.io/coreos/hyperkube:v1.1.7-coreos.1",
+				NotifyOn: model.NotifyOnDefaults,
 			},
 		},
 	}