Skip to content

Commit 06c778b

Browse files
author
Stephan Lukas
committed
fix: Fixed handling of docker images with repository domain in path
1 parent 1dccddf commit 06c778b

File tree

5 files changed

+101
-3
lines changed

5 files changed

+101
-3
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ require (
99
github.com/jedib0t/go-pretty/v6 v6.1.1 // indirect
1010
github.com/opencontainers/image-spec v1.0.1 // indirect
1111
github.com/pkg/errors v0.9.1 // indirect
12+
github.com/stretchr/testify v1.7.0 // indirect
1213
)

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
22
github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o=
33
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
44
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
56
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
67
github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af h1:ujR+JcSHkOZMctuIgvi+a/VHpTn0nSy0W7eV5p34xjg=
78
github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
@@ -98,6 +99,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
9899
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
99100
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
100101
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
102+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
101103
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
102104
github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
103105
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
@@ -120,6 +122,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
120122
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
121123
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
122124
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
125+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
126+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
123127
github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
124128
github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
125129
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
@@ -170,6 +174,8 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD
170174
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
171175
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
172176
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
177+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
178+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
173179
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
174180
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
175181
mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY=

src/docker/docker.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"io/ioutil"
99
"net/http"
1010
"net/url"
11+
"regexp"
1112
"strings"
1213

1314
"github.com/docker/distribution/manifest/schema2"
@@ -19,6 +20,9 @@ type ImageIdentifiers struct {
1920
Tag string
2021
}
2122

23+
var RegexpProtocol = regexp.MustCompile("^(http[s]?://)")
24+
var RegexpDoubleSlash = regexp.MustCompile("/{2,}")
25+
2226
func parseBearer(bearer string) map[string]string {
2327
out := make(map[string]string)
2428

@@ -41,10 +45,24 @@ func parseBearer(bearer string) map[string]string {
4145
return out
4246
}
4347

44-
func ParseImageIdentifiers(dockerImagePath string) (*ImageIdentifiers, error) {
48+
func ParseImageIdentifiers(dockerImagePath string, registryDomain string) (*ImageIdentifiers, error) {
49+
registryDomain = strings.ToLower(registryDomain)
50+
registryDomain = RegexpProtocol.ReplaceAllString(registryDomain, "")
51+
registryDomain = strings.TrimRight(registryDomain, "/")
52+
53+
dockerImagePath = strings.ToLower(dockerImagePath)
54+
dockerImagePath = RegexpProtocol.ReplaceAllString(dockerImagePath, "")
55+
dockerImagePath = RegexpDoubleSlash.ReplaceAllString(dockerImagePath, "/")
56+
57+
if strings.HasPrefix(dockerImagePath, registryDomain) {
58+
// Remove Domain
59+
dockerImagePath = strings.Replace(dockerImagePath, registryDomain, "", 1)
60+
}
61+
4562
dockerImagePathParts := strings.SplitN(dockerImagePath, ":", 2)
4663
repository := ""
4764
tag := ""
65+
4866
switch len(dockerImagePathParts) {
4967
case 1:
5068
repository = dockerImagePathParts[0]
@@ -57,7 +75,7 @@ func ParseImageIdentifiers(dockerImagePath string) (*ImageIdentifiers, error) {
5775
}
5876

5977
return &ImageIdentifiers{
60-
Repository: repository,
78+
Repository: strings.Trim(repository, "/"),
6179
Tag: tag,
6280
}, nil
6381
}

src/docker/docker_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package docker
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestParseImageIdentifiers(t *testing.T) {
10+
path := "myorga/myimage:v1.0.0"
11+
12+
identifier, err := ParseImageIdentifiers(path, "docker.mydomain.com")
13+
14+
assert.NoError(t, err)
15+
assert.NotNil(t, identifier)
16+
assert.Equal(t, "myorga/myimage", identifier.Repository)
17+
assert.Equal(t, "v1.0.0", identifier.Tag)
18+
}
19+
20+
func TestParseImageIdentifiersNoTag(t *testing.T) {
21+
path := "myorga/myimage"
22+
23+
identifier, err := ParseImageIdentifiers(path, "docker.mydomain.com")
24+
25+
assert.NoError(t, err)
26+
assert.NotNil(t, identifier)
27+
assert.Equal(t, "myorga/myimage", identifier.Repository)
28+
assert.Equal(t, "latest", identifier.Tag)
29+
}
30+
31+
func TestParseImageIdentifiersSha256Tag(t *testing.T) {
32+
path := "myorga/myimage:sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
33+
34+
identifier, err := ParseImageIdentifiers(path, "docker.mydomain.com")
35+
36+
assert.NoError(t, err)
37+
assert.NotNil(t, identifier)
38+
assert.Equal(t, "myorga/myimage", identifier.Repository)
39+
assert.Equal(t, "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4", identifier.Tag)
40+
}
41+
42+
func TestParseImageIdentifiersWithDomain(t *testing.T) {
43+
path := "test.domain.com/myorga/myimage:v1.0.0"
44+
45+
identifier, err := ParseImageIdentifiers(path, "test.domain.com")
46+
47+
assert.NoError(t, err)
48+
assert.NotNil(t, identifier)
49+
assert.Equal(t, "myorga/myimage", identifier.Repository)
50+
assert.Equal(t, "v1.0.0", identifier.Tag)
51+
}
52+
53+
func TestParseImageIdentifiersWithHttpURL(t *testing.T) {
54+
path := "http://test.domain.com/myorga/myimage:v1.0.0"
55+
56+
identifier, err := ParseImageIdentifiers(path, "test.domain.com")
57+
58+
assert.NoError(t, err)
59+
assert.NotNil(t, identifier)
60+
assert.Equal(t, "myorga/myimage", identifier.Repository)
61+
assert.Equal(t, "v1.0.0", identifier.Tag)
62+
}
63+
64+
func TestParseImageIdentifiersWithHttpsURL(t *testing.T) {
65+
path := "https://test.DOMAIN.com//myorga/myimage:v1.0.0"
66+
67+
identifier, err := ParseImageIdentifiers(path, "http://test.domain.com//")
68+
69+
assert.NoError(t, err)
70+
assert.NotNil(t, identifier)
71+
assert.Equal(t, "myorga/myimage", identifier.Repository)
72+
assert.Equal(t, "v1.0.0", identifier.Tag)
73+
}

src/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func main() {
7474
return
7575
}
7676

77-
imageIdentifiers, err := docker.ParseImageIdentifiers(*flagImage)
77+
imageIdentifiers, err := docker.ParseImageIdentifiers(*flagImage, dockerClient.GetRegistry())
7878
if err != nil {
7979
fmt.Fprintf(os.Stderr, "Error parsing docker image name: %s\n", err)
8080

0 commit comments

Comments
 (0)