You've already forked watchtower
mirror of
https://github.com/containrrr/watchtower.git
synced 2025-07-03 23:30:42 +02:00
Add ability to overrider depending containers with special label (#489)
* Add ability to overrider depending containers with special label * Add documentation of how to override container dependencies with special label
This commit is contained in:
committed by
GitHub
parent
7b0d311799
commit
b32cb5d35d
@ -1,3 +1,5 @@
|
|||||||
Watchtower will detect if there are links between any of the running containers and ensures that things are stopped/started in a way that won't break any of the links. If an update is detected for one of the dependencies in a group of linked containers, watchtower will stop and start all of the containers in the correct order so that the application comes back up correctly.
|
Watchtower will detect if there are links between any of the running containers and ensures that things are stopped/started in a way that won't break any of the links. If an update is detected for one of the dependencies in a group of linked containers, watchtower will stop and start all of the containers in the correct order so that the application comes back up correctly.
|
||||||
|
|
||||||
For example, imagine you were running a _mysql_ container and a _wordpress_ container which had been linked to the _mysql_ container. If watchtower were to detect that the _mysql_ container required an update, it would first shut down the linked _wordpress_ container followed by the _mysql_ container. When restarting the containers it would handle _mysql_ first and then _wordpress_ to ensure that the link continued to work.
|
For example, imagine you were running a _mysql_ container and a _wordpress_ container which had been linked to the _mysql_ container. If watchtower were to detect that the _mysql_ container required an update, it would first shut down the linked _wordpress_ container followed by the _mysql_ container. When restarting the containers it would handle _mysql_ first and then _wordpress_ to ensure that the link continued to work.
|
||||||
|
|
||||||
|
If you want to override existing links you can use special `com.centurylinklabs.watchtower.depends-on` label with dependent container names, separated by a comma.
|
||||||
|
@ -95,6 +95,13 @@ func (c Container) Enabled() (bool, bool) {
|
|||||||
func (c Container) Links() []string {
|
func (c Container) Links() []string {
|
||||||
var links []string
|
var links []string
|
||||||
|
|
||||||
|
dependsOnLabelValue := c.getLabelValueOrEmpty(dependsOnLabel)
|
||||||
|
|
||||||
|
if dependsOnLabelValue != "" {
|
||||||
|
links := strings.Split(dependsOnLabelValue, ",")
|
||||||
|
return links
|
||||||
|
}
|
||||||
|
|
||||||
if (c.containerInfo != nil) && (c.containerInfo.HostConfig != nil) {
|
if (c.containerInfo != nil) && (c.containerInfo.HostConfig != nil) {
|
||||||
for _, link := range c.containerInfo.HostConfig.Links {
|
for _, link := range c.containerInfo.HostConfig.Links {
|
||||||
name := strings.Split(link, ":")[0]
|
name := strings.Split(link, ":")[0]
|
||||||
|
@ -181,6 +181,42 @@ var _ = Describe("the container", func() {
|
|||||||
Expect(imageName).To(Equal(name + ":latest"))
|
Expect(imageName).To(Equal(name + ":latest"))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
When("fetching container links", func() {
|
||||||
|
When("the depends on label is present", func() {
|
||||||
|
It("should fetch depending containers from it", func() {
|
||||||
|
c = mockContainerWithLabels(map[string]string{
|
||||||
|
"com.centurylinklabs.watchtower.depends-on": "postgres",
|
||||||
|
})
|
||||||
|
links := c.Links()
|
||||||
|
Expect(links).To(SatisfyAll(ContainElement("postgres"), HaveLen(1)))
|
||||||
|
})
|
||||||
|
It("should fetch depending containers if there are many", func() {
|
||||||
|
c = mockContainerWithLabels(map[string]string{
|
||||||
|
"com.centurylinklabs.watchtower.depends-on": "postgres,redis",
|
||||||
|
})
|
||||||
|
links := c.Links()
|
||||||
|
Expect(links).To(SatisfyAll(ContainElement("postgres"), ContainElement("redis"), HaveLen(2)))
|
||||||
|
})
|
||||||
|
It("should fetch depending containers if label is blank", func() {
|
||||||
|
c = mockContainerWithLabels(map[string]string{
|
||||||
|
"com.centurylinklabs.watchtower.depends-on": "",
|
||||||
|
})
|
||||||
|
links := c.Links()
|
||||||
|
Expect(links).To(HaveLen(0))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
When("the depends on label is not present", func() {
|
||||||
|
It("should fetch depending containers from host config links", func() {
|
||||||
|
c = mockContainerWithLinks([]string{
|
||||||
|
"redis:test-containrrr",
|
||||||
|
"postgres:test-containrrr",
|
||||||
|
})
|
||||||
|
links := c.Links()
|
||||||
|
Expect(links).To(SatisfyAll(ContainElement("redis"), ContainElement("postgres"), HaveLen(2)))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -190,6 +226,23 @@ func mockContainerWithImageName(name string) *Container {
|
|||||||
return container
|
return container
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func mockContainerWithLinks(links []string) *Container {
|
||||||
|
content := types.ContainerJSON{
|
||||||
|
ContainerJSONBase: &types.ContainerJSONBase{
|
||||||
|
ID: "container_id",
|
||||||
|
Image: "image",
|
||||||
|
Name: "test-containrrr",
|
||||||
|
HostConfig: &container.HostConfig{
|
||||||
|
Links: links,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Config: &container.Config{
|
||||||
|
Labels: map[string]string{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return NewContainer(&content, nil)
|
||||||
|
}
|
||||||
|
|
||||||
func mockContainerWithLabels(labels map[string]string) *Container {
|
func mockContainerWithLabels(labels map[string]string) *Container {
|
||||||
content := types.ContainerJSON{
|
content := types.ContainerJSON{
|
||||||
ContainerJSONBase: &types.ContainerJSONBase{
|
ContainerJSONBase: &types.ContainerJSONBase{
|
||||||
|
@ -4,6 +4,7 @@ const (
|
|||||||
watchtowerLabel = "com.centurylinklabs.watchtower"
|
watchtowerLabel = "com.centurylinklabs.watchtower"
|
||||||
signalLabel = "com.centurylinklabs.watchtower.stop-signal"
|
signalLabel = "com.centurylinklabs.watchtower.stop-signal"
|
||||||
enableLabel = "com.centurylinklabs.watchtower.enable"
|
enableLabel = "com.centurylinklabs.watchtower.enable"
|
||||||
|
dependsOnLabel = "com.centurylinklabs.watchtower.depends-on"
|
||||||
zodiacLabel = "com.centurylinklabs.zodiac.original-image"
|
zodiacLabel = "com.centurylinklabs.zodiac.original-image"
|
||||||
preCheckLabel = "com.centurylinklabs.watchtower.lifecycle.pre-check"
|
preCheckLabel = "com.centurylinklabs.watchtower.lifecycle.pre-check"
|
||||||
postCheckLabel = "com.centurylinklabs.watchtower.lifecycle.post-check"
|
postCheckLabel = "com.centurylinklabs.watchtower.lifecycle.post-check"
|
||||||
|
Reference in New Issue
Block a user