mirror of
https://github.com/containrrr/watchtower.git
synced 2025-09-22 05:40:50 +02:00
Add --no-pull support
This commit is contained in:
parent
a8dec129f5
commit
3d0c853e42
3 changed files with 36 additions and 17 deletions
|
@ -14,14 +14,6 @@ const (
|
||||||
signalLabel = "com.centurylinklabs.watchtower.stop-signal"
|
signalLabel = "com.centurylinklabs.watchtower.stop-signal"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
pullImages bool
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
pullImages = true
|
|
||||||
}
|
|
||||||
|
|
||||||
type Filter func(Container) bool
|
type Filter func(Container) bool
|
||||||
|
|
||||||
type Client interface {
|
type Client interface {
|
||||||
|
@ -32,18 +24,19 @@ type Client interface {
|
||||||
IsContainerStale(Container) (bool, error)
|
IsContainerStale(Container) (bool, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewClient(dockerHost string) Client {
|
func NewClient(dockerHost string, pullImages bool) Client {
|
||||||
docker, err := dockerclient.NewDockerClient(dockerHost, nil)
|
docker, err := dockerclient.NewDockerClient(dockerHost, nil)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error instantiating Docker client: %s\n", err)
|
log.Fatalf("Error instantiating Docker client: %s\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return DockerClient{api: docker}
|
return DockerClient{api: docker, pullImages: pullImages}
|
||||||
}
|
}
|
||||||
|
|
||||||
type DockerClient struct {
|
type DockerClient struct {
|
||||||
api dockerclient.Client
|
api dockerclient.Client
|
||||||
|
pullImages bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (client DockerClient) ListContainers(fn Filter) ([]Container, error) {
|
func (client DockerClient) ListContainers(fn Filter) ([]Container, error) {
|
||||||
|
@ -121,7 +114,7 @@ func (client DockerClient) IsContainerStale(c Container) (bool, error) {
|
||||||
oldImageInfo := c.imageInfo
|
oldImageInfo := c.imageInfo
|
||||||
imageName := containerInfo.Config.Image
|
imageName := containerInfo.Config.Image
|
||||||
|
|
||||||
if pullImages {
|
if client.pullImages {
|
||||||
if !strings.Contains(imageName, ":") {
|
if !strings.Contains(imageName, ":") {
|
||||||
imageName = fmt.Sprintf("%s:latest", imageName)
|
imageName = fmt.Sprintf("%s:latest", imageName)
|
||||||
}
|
}
|
||||||
|
|
|
@ -305,7 +305,7 @@ func TestIsContainerStale_NotStaleSuccess(t *testing.T) {
|
||||||
api.On("PullImage", "bar:latest", mock.Anything).Return(nil)
|
api.On("PullImage", "bar:latest", mock.Anything).Return(nil)
|
||||||
api.On("InspectImage", "bar:latest").Return(newImageInfo, nil)
|
api.On("InspectImage", "bar:latest").Return(newImageInfo, nil)
|
||||||
|
|
||||||
client := DockerClient{api: api}
|
client := DockerClient{api: api, pullImages: true}
|
||||||
stale, err := client.IsContainerStale(c)
|
stale, err := client.IsContainerStale(c)
|
||||||
|
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
@ -327,7 +327,28 @@ func TestIsContainerStale_StaleSuccess(t *testing.T) {
|
||||||
api.On("PullImage", "bar:1.0", mock.Anything).Return(nil)
|
api.On("PullImage", "bar:1.0", mock.Anything).Return(nil)
|
||||||
api.On("InspectImage", "bar:1.0").Return(newImageInfo, nil)
|
api.On("InspectImage", "bar:1.0").Return(newImageInfo, nil)
|
||||||
|
|
||||||
client := DockerClient{api: api}
|
client := DockerClient{api: api, pullImages: true}
|
||||||
|
stale, err := client.IsContainerStale(c)
|
||||||
|
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, stale)
|
||||||
|
api.AssertExpectations(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIsContainerStale_NoPullSuccess(t *testing.T) {
|
||||||
|
c := Container{
|
||||||
|
containerInfo: &dockerclient.ContainerInfo{
|
||||||
|
Name: "foo",
|
||||||
|
Config: &dockerclient.ContainerConfig{Image: "bar:1.0"},
|
||||||
|
},
|
||||||
|
imageInfo: &dockerclient.ImageInfo{Id: "abc123"},
|
||||||
|
}
|
||||||
|
newImageInfo := &dockerclient.ImageInfo{Id: "xyz789"}
|
||||||
|
|
||||||
|
api := mockclient.NewMockClient()
|
||||||
|
api.On("InspectImage", "bar:1.0").Return(newImageInfo, nil)
|
||||||
|
|
||||||
|
client := DockerClient{api: api, pullImages: false}
|
||||||
stale, err := client.IsContainerStale(c)
|
stale, err := client.IsContainerStale(c)
|
||||||
|
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
@ -347,7 +368,7 @@ func TestIsContainerStale_PullImageError(t *testing.T) {
|
||||||
api := mockclient.NewMockClient()
|
api := mockclient.NewMockClient()
|
||||||
api.On("PullImage", "bar:latest", mock.Anything).Return(errors.New("oops"))
|
api.On("PullImage", "bar:latest", mock.Anything).Return(errors.New("oops"))
|
||||||
|
|
||||||
client := DockerClient{api: api}
|
client := DockerClient{api: api, pullImages: true}
|
||||||
_, err := client.IsContainerStale(c)
|
_, err := client.IsContainerStale(c)
|
||||||
|
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
|
@ -369,7 +390,7 @@ func TestIsContainerStale_InspectImageError(t *testing.T) {
|
||||||
api.On("PullImage", "bar:latest", mock.Anything).Return(nil)
|
api.On("PullImage", "bar:latest", mock.Anything).Return(nil)
|
||||||
api.On("InspectImage", "bar:latest").Return(newImageInfo, errors.New("uh-oh"))
|
api.On("InspectImage", "bar:latest").Return(newImageInfo, errors.New("uh-oh"))
|
||||||
|
|
||||||
client := DockerClient{api: api}
|
client := DockerClient{api: api, pullImages: true}
|
||||||
_, err := client.IsContainerStale(c)
|
_, err := client.IsContainerStale(c)
|
||||||
|
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
|
|
7
main.go
7
main.go
|
@ -35,6 +35,10 @@ func main() {
|
||||||
Value: 300,
|
Value: 300,
|
||||||
Usage: "poll interval (in seconds)",
|
Usage: "poll interval (in seconds)",
|
||||||
},
|
},
|
||||||
|
cli.BoolFlag{
|
||||||
|
Name: "no-pull",
|
||||||
|
Usage: "do not pull new images",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSignals()
|
handleSignals()
|
||||||
|
@ -76,5 +80,6 @@ func start(c *cli.Context) {
|
||||||
|
|
||||||
func newContainerClient(c *cli.Context) container.Client {
|
func newContainerClient(c *cli.Context) container.Client {
|
||||||
dockerHost := c.GlobalString("host")
|
dockerHost := c.GlobalString("host")
|
||||||
return container.NewClient(dockerHost)
|
noPull := c.GlobalBool("no-pull")
|
||||||
|
return container.NewClient(dockerHost, !noPull)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue