Skip to content

Commit 6a79965

Browse files
authored
fix(agent/agentcontainers): handle race between docker ps and docker inspect (#17447)
Fixes coder/internal#586 (comment)
1 parent b3aba6d commit 6a79965

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

agent/agentcontainers/containers_dockercli.go

+17-14
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,6 @@ import (
2424
"github.com/coder/coder/v2/codersdk"
2525
)
2626

27-
// DockerCLILister is a ContainerLister that lists containers using the docker CLI
28-
type DockerCLILister struct {
29-
execer agentexec.Execer
30-
}
31-
32-
var _ Lister = &DockerCLILister{}
33-
34-
func NewDocker(execer agentexec.Execer) Lister {
35-
return &DockerCLILister{
36-
execer: agentexec.DefaultExecer,
37-
}
38-
}
39-
4027
// DockerEnvInfoer is an implementation of agentssh.EnvInfoer that returns
4128
// information about a container.
4229
type DockerEnvInfoer struct {
@@ -241,6 +228,19 @@ func run(ctx context.Context, execer agentexec.Execer, cmd string, args ...strin
241228
return stdout, stderr, err
242229
}
243230

231+
// DockerCLILister is a ContainerLister that lists containers using the docker CLI
232+
type DockerCLILister struct {
233+
execer agentexec.Execer
234+
}
235+
236+
var _ Lister = &DockerCLILister{}
237+
238+
func NewDocker(execer agentexec.Execer) Lister {
239+
return &DockerCLILister{
240+
execer: agentexec.DefaultExecer,
241+
}
242+
}
243+
244244
func (dcl *DockerCLILister) List(ctx context.Context) (codersdk.WorkspaceAgentListContainersResponse, error) {
245245
var stdoutBuf, stderrBuf bytes.Buffer
246246
// List all container IDs, one per line, with no truncation
@@ -319,9 +319,12 @@ func runDockerInspect(ctx context.Context, execer agentexec.Execer, ids ...strin
319319
stdout = bytes.TrimSpace(stdoutBuf.Bytes())
320320
stderr = bytes.TrimSpace(stderrBuf.Bytes())
321321
if err != nil {
322+
if bytes.Contains(stderr, []byte("No such object:")) {
323+
// This can happen if a container is deleted between the time we check for its existence and the time we inspect it.
324+
return stdout, stderr, nil
325+
}
322326
return stdout, stderr, err
323327
}
324-
325328
return stdout, stderr, nil
326329
}
327330

agent/agentcontainers/devcontainercli_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,9 @@ func TestDockerDevcontainerCLI(t *testing.T) {
229229
if os.Getenv("CODER_TEST_USE_DOCKER") != "1" {
230230
t.Skip("skipping Docker test; set CODER_TEST_USE_DOCKER=1 to run")
231231
}
232+
if _, err := exec.LookPath("devcontainer"); err != nil {
233+
t.Fatal("this test requires the devcontainer CLI: npm install -g @devcontainers/cli")
234+
}
232235

233236
// Connect to Docker.
234237
pool, err := dockertest.NewPool("")

0 commit comments

Comments
 (0)