Skip to content

Commit 0a3bb6e

Browse files
committed
fix: extract correct CID from mountinfo files
Instead of extracting the first 64 characters ID found
1 parent b3387b1 commit 0a3bb6e

File tree

1 file changed

+34
-38
lines changed

1 file changed

+34
-38
lines changed

context.go

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ package dockergen
22

33
import (
44
"bufio"
5-
"bytes"
65
"fmt"
7-
"io"
86
"os"
97
"regexp"
108
"sync"
@@ -169,43 +167,42 @@ func GetCurrentContainerID(filepaths ...string) (id string) {
169167
filepaths = []string{"/proc/1/cpuset", "/proc/self/cgroup", "/proc/self/mountinfo"}
170168
}
171169

172-
var files []io.Reader
173-
170+
// We try to match a 64 character hex string starting with the hostname first
174171
for _, filepath := range filepaths {
175172
file, err := os.Open(filepath)
176173
if err != nil {
177174
continue
178175
}
179176
defer file.Close()
180-
files = append(files, file)
181-
}
182-
183-
reader := io.MultiReader(files...)
184-
var buffer bytes.Buffer
185-
tee := io.TeeReader(reader, &buffer)
186-
187-
// We try to match a 64 character hex string starting with the hostname first
188-
scanner := bufio.NewScanner(tee)
189-
scanner.Split(bufio.ScanLines)
190-
for scanner.Scan() {
191-
_, lines, err := bufio.ScanLines([]byte(scanner.Text()), true)
192-
if err == nil {
193-
strLines := string(lines)
194-
if id = matchContainerIDWithHostname(strLines); len(id) == 64 {
195-
return
177+
scanner := bufio.NewScanner(file)
178+
scanner.Split(bufio.ScanLines)
179+
for scanner.Scan() {
180+
_, lines, err := bufio.ScanLines([]byte(scanner.Text()), true)
181+
if err == nil {
182+
strLines := string(lines)
183+
if id = matchContainerIDWithHostname(strLines); len(id) == 64 {
184+
return
185+
}
196186
}
197187
}
198188
}
199189

200190
// If we didn't get any ID that matches the hostname, fall back to matching the first 64 character hex string
201-
scanner = bufio.NewScanner(&buffer)
202-
scanner.Split(bufio.ScanLines)
203-
for scanner.Scan() {
204-
_, lines, err := bufio.ScanLines([]byte(scanner.Text()), true)
205-
if err == nil {
206-
strLines := string(lines)
207-
if id = matchContainerID(strLines); len(id) == 64 {
208-
return
191+
for _, filepath := range filepaths {
192+
file, err := os.Open(filepath)
193+
if err != nil {
194+
continue
195+
}
196+
defer file.Close()
197+
scanner := bufio.NewScanner(file)
198+
scanner.Split(bufio.ScanLines)
199+
for scanner.Scan() {
200+
_, lines, err := bufio.ScanLines([]byte(scanner.Text()), true)
201+
if err == nil {
202+
strLines := string(lines)
203+
if id = matchContainerID("([[:alnum:]]{64})", strLines); len(id) == 64 {
204+
return
205+
}
209206
}
210207
}
211208
}
@@ -219,22 +216,21 @@ func matchContainerIDWithHostname(lines string) string {
219216

220217
if re.MatchString(hostname) {
221218
regex := fmt.Sprintf("(%s[[:alnum:]]{52})", hostname)
222-
re := regexp.MustCompilePOSIX(regex)
223219

224-
if re.MatchString(lines) {
225-
submatches := re.FindStringSubmatch(string(lines))
226-
containerID := submatches[1]
227-
228-
return containerID
229-
}
220+
return matchContainerID(regex, lines)
230221
}
231222
return ""
232223
}
233224

234-
func matchContainerID(lines string) string {
235-
regex := "([[:alnum:]]{64})"
236-
re := regexp.MustCompilePOSIX(regex)
225+
func matchContainerID(regex, lines string) string {
226+
// Attempt to detect if we're on a line from a /proc/<pid>/mountinfo file and modify the regexp accordingly
227+
// https://www.kernel.org/doc/Documentation/filesystems/proc.txt section 3.5
228+
re := regexp.MustCompilePOSIX("^[0-9]+ [0-9]+ [0-9]+:[0-9]+ /")
229+
if re.MatchString(lines) {
230+
regex = fmt.Sprintf("containers/%v", regex)
231+
}
237232

233+
re = regexp.MustCompilePOSIX(regex)
238234
if re.MatchString(lines) {
239235
submatches := re.FindStringSubmatch(string(lines))
240236
containerID := submatches[1]

0 commit comments

Comments
 (0)