From 74d0c39cb3f182eadf8d92f260904608334a25ca Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Tue, 2 Dec 2025 15:33:01 +0200 Subject: [PATCH] fix(agent/agentcontainer): allow lifecycle script error on devcontainer up (#21020) When devcontainer up fails due to a lifecycle script error like postCreateCommand, the CLI still returns a container ID. Previously this was discarded and the devcontainer marked as failed. Now we continue with agent injection if a container ID is available, allowing users to debug the issue in the running container. Fixes coder/internal#1137 --- agent/agentcontainers/api.go | 61 +++++--- agent/agentcontainers/api_test.go | 112 +++++++++++++ agent/agentcontainers/devcontainercli.go | 31 ++-- agent/agentcontainers/devcontainercli_test.go | 105 ++++++++----- .../parse/up-error-lifecycle-script.log | 147 ++++++++++++++++++ 5 files changed, 381 insertions(+), 75 deletions(-) create mode 100644 agent/agentcontainers/testdata/devcontainercli/parse/up-error-lifecycle-script.log diff --git a/agent/agentcontainers/api.go b/agent/agentcontainers/api.go index b5a6ed74d5..2a1023f473 100644 --- a/agent/agentcontainers/api.go +++ b/agent/agentcontainers/api.go @@ -1039,6 +1039,10 @@ func (api *API) processUpdatedContainersLocked(ctx context.Context, updated code logger.Error(ctx, "inject subagent into container failed", slog.Error(err)) dc.Error = err.Error() } else { + // TODO(mafredri): Preserve the error from devcontainer + // up if it was a lifecycle script error. Currently + // this results in a brief flicker for the user if + // injection is fast, as the error is shown then erased. dc.Error = "" } } @@ -1347,27 +1351,41 @@ func (api *API) CreateDevcontainer(workspaceFolder, configPath string, opts ...D upOptions := []DevcontainerCLIUpOptions{WithUpOutput(infoW, errW)} upOptions = append(upOptions, opts...) - _, err := api.dccli.Up(ctx, dc.WorkspaceFolder, configPath, upOptions...) - if err != nil { + containerID, upErr := api.dccli.Up(ctx, dc.WorkspaceFolder, configPath, upOptions...) + if upErr != nil { // No need to log if the API is closing (context canceled), as this // is expected behavior when the API is shutting down. - if !errors.Is(err, context.Canceled) { - logger.Error(ctx, "devcontainer creation failed", slog.Error(err)) + if !errors.Is(upErr, context.Canceled) { + logger.Error(ctx, "devcontainer creation failed", slog.Error(upErr)) } - api.mu.Lock() - dc = api.knownDevcontainers[dc.WorkspaceFolder] - dc.Status = codersdk.WorkspaceAgentDevcontainerStatusError - dc.Error = err.Error() - api.knownDevcontainers[dc.WorkspaceFolder] = dc - api.recreateErrorTimes[dc.WorkspaceFolder] = api.clock.Now("agentcontainers", "recreate", "errorTimes") - api.mu.Unlock() + // If we don't have a container ID, the error is fatal, so we + // should mark the devcontainer as errored and return. + if containerID == "" { + api.mu.Lock() + dc = api.knownDevcontainers[dc.WorkspaceFolder] + dc.Status = codersdk.WorkspaceAgentDevcontainerStatusError + dc.Error = upErr.Error() + api.knownDevcontainers[dc.WorkspaceFolder] = dc + api.recreateErrorTimes[dc.WorkspaceFolder] = api.clock.Now("agentcontainers", "recreate", "errorTimes") + api.broadcastUpdatesLocked() + api.mu.Unlock() - return xerrors.Errorf("start devcontainer: %w", err) + return xerrors.Errorf("start devcontainer: %w", upErr) + } + + // If we have a container ID, it means the container was created + // but a lifecycle script (e.g. postCreateCommand) failed. In this + // case, we still want to refresh containers to pick up the new + // container, inject the agent, and allow the user to debug the + // issue. We store the error to surface it to the user. + logger.Warn(ctx, "devcontainer created with errors (e.g. lifecycle script failure), container is available", + slog.F("container_id", containerID), + ) + } else { + logger.Info(ctx, "devcontainer created successfully") } - logger.Info(ctx, "devcontainer created successfully") - api.mu.Lock() dc = api.knownDevcontainers[dc.WorkspaceFolder] // Update the devcontainer status to Running or Stopped based on the @@ -1376,13 +1394,18 @@ func (api *API) CreateDevcontainer(workspaceFolder, configPath string, opts ...D // to minimize the time between API consistency, we guess the status // based on the container state. dc.Status = codersdk.WorkspaceAgentDevcontainerStatusStopped - if dc.Container != nil { - if dc.Container.Running { - dc.Status = codersdk.WorkspaceAgentDevcontainerStatusRunning - } + if dc.Container != nil && dc.Container.Running { + dc.Status = codersdk.WorkspaceAgentDevcontainerStatusRunning } dc.Dirty = false - dc.Error = "" + if upErr != nil { + // If there was a lifecycle script error but we have a container ID, + // the container is running so we should set the status to Running. + dc.Status = codersdk.WorkspaceAgentDevcontainerStatusRunning + dc.Error = upErr.Error() + } else { + dc.Error = "" + } api.recreateSuccessTimes[dc.WorkspaceFolder] = api.clock.Now("agentcontainers", "recreate", "successTimes") api.knownDevcontainers[dc.WorkspaceFolder] = dc api.broadcastUpdatesLocked() diff --git a/agent/agentcontainers/api_test.go b/agent/agentcontainers/api_test.go index 263f1698a7..4e7926cf1d 100644 --- a/agent/agentcontainers/api_test.go +++ b/agent/agentcontainers/api_test.go @@ -2070,6 +2070,118 @@ func TestAPI(t *testing.T) { require.Equal(t, "", response.Devcontainers[0].Error) }) + // This test verifies that when devcontainer up fails due to a + // lifecycle script error (such as postCreateCommand failing) but the + // container was successfully created, we still proceed with the + // devcontainer. The container should be available for use and the + // agent should be injected. + t.Run("DuringUpWithContainerID", func(t *testing.T) { + t.Parallel() + + var ( + ctx = testutil.Context(t, testutil.WaitMedium) + logger = slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug) + mClock = quartz.NewMock(t) + + testContainer = codersdk.WorkspaceAgentContainer{ + ID: "test-container-id", + FriendlyName: "test-container", + Image: "test-image", + Running: true, + CreatedAt: time.Now(), + Labels: map[string]string{ + agentcontainers.DevcontainerLocalFolderLabel: "/workspaces/project", + agentcontainers.DevcontainerConfigFileLabel: "/workspaces/project/.devcontainer/devcontainer.json", + }, + } + fCCLI = &fakeContainerCLI{ + containers: codersdk.WorkspaceAgentListContainersResponse{ + Containers: []codersdk.WorkspaceAgentContainer{testContainer}, + }, + arch: "amd64", + } + fDCCLI = &fakeDevcontainerCLI{ + upID: testContainer.ID, + upErrC: make(chan func() error, 1), + } + fSAC = &fakeSubAgentClient{ + logger: logger.Named("fakeSubAgentClient"), + } + + testDevcontainer = codersdk.WorkspaceAgentDevcontainer{ + ID: uuid.New(), + Name: "test-devcontainer", + WorkspaceFolder: "/workspaces/project", + ConfigPath: "/workspaces/project/.devcontainer/devcontainer.json", + Status: codersdk.WorkspaceAgentDevcontainerStatusStopped, + } + ) + + mClock.Set(time.Now()).MustWait(ctx) + tickerTrap := mClock.Trap().TickerFunc("updaterLoop") + nowRecreateSuccessTrap := mClock.Trap().Now("recreate", "successTimes") + + api := agentcontainers.NewAPI(logger, + agentcontainers.WithClock(mClock), + agentcontainers.WithContainerCLI(fCCLI), + agentcontainers.WithDevcontainerCLI(fDCCLI), + agentcontainers.WithDevcontainers( + []codersdk.WorkspaceAgentDevcontainer{testDevcontainer}, + []codersdk.WorkspaceAgentScript{{ID: testDevcontainer.ID, LogSourceID: uuid.New()}}, + ), + agentcontainers.WithSubAgentClient(fSAC), + agentcontainers.WithSubAgentURL("test-subagent-url"), + agentcontainers.WithWatcher(watcher.NewNoop()), + ) + api.Start() + defer func() { + close(fDCCLI.upErrC) + api.Close() + }() + + r := chi.NewRouter() + r.Mount("/", api.Routes()) + + tickerTrap.MustWait(ctx).MustRelease(ctx) + tickerTrap.Close() + + // Send a recreate request to trigger devcontainer up. + req := httptest.NewRequest(http.MethodPost, "/devcontainers/"+testDevcontainer.ID.String()+"/recreate", nil) + rec := httptest.NewRecorder() + r.ServeHTTP(rec, req) + require.Equal(t, http.StatusAccepted, rec.Code) + + // Simulate a lifecycle script failure. The devcontainer CLI + // will return an error but also provide a container ID since + // the container was created before the script failed. + simulatedError := xerrors.New("postCreateCommand failed with exit code 1") + testutil.RequireSend(ctx, t, fDCCLI.upErrC, func() error { return simulatedError }) + + // Wait for the recreate operation to complete. We expect it to + // record a success time because the container was created. + nowRecreateSuccessTrap.MustWait(ctx).MustRelease(ctx) + nowRecreateSuccessTrap.Close() + + req = httptest.NewRequest(http.MethodGet, "/", nil) + rec = httptest.NewRecorder() + r.ServeHTTP(rec, req) + require.Equal(t, http.StatusOK, rec.Code) + + var response codersdk.WorkspaceAgentListContainersResponse + err := json.NewDecoder(rec.Body).Decode(&response) + require.NoError(t, err) + + // Verify that the devcontainer is running and has the container + // associated with it despite the lifecycle script error. The + // error may be cleared during refresh if agent injection + // succeeds, but the important thing is that the container is + // available for use. + require.Len(t, response.Devcontainers, 1) + assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusRunning, response.Devcontainers[0].Status) + assert.NotNil(t, response.Devcontainers[0].Container) + assert.Equal(t, testContainer.ID, response.Devcontainers[0].Container.ID) + }) + t.Run("DuringInjection", func(t *testing.T) { t.Parallel() diff --git a/agent/agentcontainers/devcontainercli.go b/agent/agentcontainers/devcontainercli.go index 2242e62f60..a0872f02b0 100644 --- a/agent/agentcontainers/devcontainercli.go +++ b/agent/agentcontainers/devcontainercli.go @@ -263,11 +263,14 @@ func (d *devcontainerCLI) Up(ctx context.Context, workspaceFolder, configPath st } if err := cmd.Run(); err != nil { - _, err2 := parseDevcontainerCLILastLine[devcontainerCLIResult](ctx, logger, stdoutBuf.Bytes()) + result, err2 := parseDevcontainerCLILastLine[devcontainerCLIResult](ctx, logger, stdoutBuf.Bytes()) if err2 != nil { err = errors.Join(err, err2) } - return "", err + // Return the container ID if available, even if there was an error. + // This can happen if the container was created successfully but a + // lifecycle script (e.g. postCreateCommand) failed. + return result.ContainerID, err } result, err := parseDevcontainerCLILastLine[devcontainerCLIResult](ctx, logger, stdoutBuf.Bytes()) @@ -275,6 +278,13 @@ func (d *devcontainerCLI) Up(ctx context.Context, workspaceFolder, configPath st return "", err } + // Check if the result indicates an error (e.g. lifecycle script failure) + // but still has a container ID, allowing the caller to potentially + // continue with the container that was created. + if err := result.Err(); err != nil { + return result.ContainerID, err + } + return result.ContainerID, nil } @@ -394,7 +404,10 @@ func parseDevcontainerCLILastLine[T any](ctx context.Context, logger slog.Logger type devcontainerCLIResult struct { Outcome string `json:"outcome"` // "error", "success". - // The following fields are set if outcome is success. + // The following fields are typically set if outcome is success, but + // ContainerID may also be present when outcome is error if the + // container was created but a lifecycle script (e.g. postCreateCommand) + // failed. ContainerID string `json:"containerId"` RemoteUser string `json:"remoteUser"` RemoteWorkspaceFolder string `json:"remoteWorkspaceFolder"` @@ -404,18 +417,6 @@ type devcontainerCLIResult struct { Description string `json:"description"` } -func (r *devcontainerCLIResult) UnmarshalJSON(data []byte) error { - type wrapperResult devcontainerCLIResult - - var wrappedResult wrapperResult - if err := json.Unmarshal(data, &wrappedResult); err != nil { - return err - } - - *r = devcontainerCLIResult(wrappedResult) - return r.Err() -} - func (r devcontainerCLIResult) Err() error { if r.Outcome == "success" { return nil diff --git a/agent/agentcontainers/devcontainercli_test.go b/agent/agentcontainers/devcontainercli_test.go index e3f0445751..c850d1fb38 100644 --- a/agent/agentcontainers/devcontainercli_test.go +++ b/agent/agentcontainers/devcontainercli_test.go @@ -42,56 +42,63 @@ func TestDevcontainerCLI_ArgsAndParsing(t *testing.T) { t.Parallel() tests := []struct { - name string - logFile string - workspace string - config string - opts []agentcontainers.DevcontainerCLIUpOptions - wantArgs string - wantError bool + name string + logFile string + workspace string + config string + opts []agentcontainers.DevcontainerCLIUpOptions + wantArgs string + wantError bool + wantContainerID bool // If true, expect a container ID even when wantError is true. }{ { - name: "success", - logFile: "up.log", - workspace: "/test/workspace", - wantArgs: "up --log-format json --workspace-folder /test/workspace", - wantError: false, + name: "success", + logFile: "up.log", + workspace: "/test/workspace", + wantArgs: "up --log-format json --workspace-folder /test/workspace", + wantError: false, + wantContainerID: true, }, { - name: "success with config", - logFile: "up.log", - workspace: "/test/workspace", - config: "/test/config.json", - wantArgs: "up --log-format json --workspace-folder /test/workspace --config /test/config.json", - wantError: false, + name: "success with config", + logFile: "up.log", + workspace: "/test/workspace", + config: "/test/config.json", + wantArgs: "up --log-format json --workspace-folder /test/workspace --config /test/config.json", + wantError: false, + wantContainerID: true, }, { - name: "already exists", - logFile: "up-already-exists.log", - workspace: "/test/workspace", - wantArgs: "up --log-format json --workspace-folder /test/workspace", - wantError: false, + name: "already exists", + logFile: "up-already-exists.log", + workspace: "/test/workspace", + wantArgs: "up --log-format json --workspace-folder /test/workspace", + wantError: false, + wantContainerID: true, }, { - name: "docker error", - logFile: "up-error-docker.log", - workspace: "/test/workspace", - wantArgs: "up --log-format json --workspace-folder /test/workspace", - wantError: true, + name: "docker error", + logFile: "up-error-docker.log", + workspace: "/test/workspace", + wantArgs: "up --log-format json --workspace-folder /test/workspace", + wantError: true, + wantContainerID: false, }, { - name: "bad outcome", - logFile: "up-error-bad-outcome.log", - workspace: "/test/workspace", - wantArgs: "up --log-format json --workspace-folder /test/workspace", - wantError: true, + name: "bad outcome", + logFile: "up-error-bad-outcome.log", + workspace: "/test/workspace", + wantArgs: "up --log-format json --workspace-folder /test/workspace", + wantError: true, + wantContainerID: false, }, { - name: "does not exist", - logFile: "up-error-does-not-exist.log", - workspace: "/test/workspace", - wantArgs: "up --log-format json --workspace-folder /test/workspace", - wantError: true, + name: "does not exist", + logFile: "up-error-does-not-exist.log", + workspace: "/test/workspace", + wantArgs: "up --log-format json --workspace-folder /test/workspace", + wantError: true, + wantContainerID: false, }, { name: "with remove existing container", @@ -100,8 +107,21 @@ func TestDevcontainerCLI_ArgsAndParsing(t *testing.T) { opts: []agentcontainers.DevcontainerCLIUpOptions{ agentcontainers.WithRemoveExistingContainer(), }, - wantArgs: "up --log-format json --workspace-folder /test/workspace --remove-existing-container", - wantError: false, + wantArgs: "up --log-format json --workspace-folder /test/workspace --remove-existing-container", + wantError: false, + wantContainerID: true, + }, + { + // This test verifies that when a lifecycle script like + // postCreateCommand fails, the CLI returns both an error + // and a container ID. The caller can then proceed with + // agent injection into the created container. + name: "lifecycle script failure with container", + logFile: "up-error-lifecycle-script.log", + workspace: "/test/workspace", + wantArgs: "up --log-format json --workspace-folder /test/workspace", + wantError: true, + wantContainerID: true, }, } @@ -122,10 +142,13 @@ func TestDevcontainerCLI_ArgsAndParsing(t *testing.T) { containerID, err := dccli.Up(ctx, tt.workspace, tt.config, tt.opts...) if tt.wantError { assert.Error(t, err, "want error") - assert.Empty(t, containerID, "expected empty container ID") } else { assert.NoError(t, err, "want no error") + } + if tt.wantContainerID { assert.NotEmpty(t, containerID, "expected non-empty container ID") + } else { + assert.Empty(t, containerID, "expected empty container ID") } }) } diff --git a/agent/agentcontainers/testdata/devcontainercli/parse/up-error-lifecycle-script.log b/agent/agentcontainers/testdata/devcontainercli/parse/up-error-lifecycle-script.log new file mode 100644 index 0000000000..b5bde14997 --- /dev/null +++ b/agent/agentcontainers/testdata/devcontainercli/parse/up-error-lifecycle-script.log @@ -0,0 +1,147 @@ +{"type":"text","level":3,"timestamp":1764589424718,"text":"@devcontainers/cli 0.80.2. Node.js v22.19.0. linux 6.8.0-60-generic x64."} +{"type":"start","level":2,"timestamp":1764589424718,"text":"Run: docker buildx version"} +{"type":"stop","level":2,"timestamp":1764589424780,"text":"Run: docker buildx version","startTimestamp":1764589424718} +{"type":"text","level":2,"timestamp":1764589424781,"text":"github.com/docker/buildx v0.30.1 9e66234aa13328a5e75b75aa5574e1ca6d6d9c01\r\n"} +{"type":"text","level":2,"timestamp":1764589424781,"text":"\u001b[1m\u001b[31m\u001b[39m\u001b[22m\r\n"} +{"type":"start","level":2,"timestamp":1764589424781,"text":"Run: docker -v"} +{"type":"stop","level":2,"timestamp":1764589424797,"text":"Run: docker -v","startTimestamp":1764589424781} +{"type":"start","level":2,"timestamp":1764589424797,"text":"Resolving Remote"} +{"type":"start","level":2,"timestamp":1764589424799,"text":"Run: git rev-parse --show-cdup"} +{"type":"stop","level":2,"timestamp":1764589424803,"text":"Run: git rev-parse --show-cdup","startTimestamp":1764589424799} +{"type":"start","level":2,"timestamp":1764589424803,"text":"Run: docker ps -q -a --filter label=devcontainer.local_folder=/tmp/devcontainer-test --filter label=devcontainer.config_file=/tmp/devcontainer-test/.devcontainer/devcontainer.json"} +{"type":"stop","level":2,"timestamp":1764589424821,"text":"Run: docker ps -q -a --filter label=devcontainer.local_folder=/tmp/devcontainer-test --filter label=devcontainer.config_file=/tmp/devcontainer-test/.devcontainer/devcontainer.json","startTimestamp":1764589424803} +{"type":"start","level":2,"timestamp":1764589424821,"text":"Run: docker ps -q -a --filter label=devcontainer.local_folder=/tmp/devcontainer-test"} +{"type":"stop","level":2,"timestamp":1764589424839,"text":"Run: docker ps -q -a --filter label=devcontainer.local_folder=/tmp/devcontainer-test","startTimestamp":1764589424821} +{"type":"start","level":2,"timestamp":1764589424841,"text":"Run: docker ps -q -a --filter label=devcontainer.local_folder=/tmp/devcontainer-test --filter label=devcontainer.config_file=/tmp/devcontainer-test/.devcontainer/devcontainer.json"} +{"type":"stop","level":2,"timestamp":1764589424855,"text":"Run: docker ps -q -a --filter label=devcontainer.local_folder=/tmp/devcontainer-test --filter label=devcontainer.config_file=/tmp/devcontainer-test/.devcontainer/devcontainer.json","startTimestamp":1764589424841} +{"type":"start","level":2,"timestamp":1764589424855,"text":"Run: docker inspect --type image ubuntu:latest"} +{"type":"stop","level":2,"timestamp":1764589424870,"text":"Run: docker inspect --type image ubuntu:latest","startTimestamp":1764589424855} +{"type":"text","level":1,"timestamp":1764589424871,"text":"> input: docker.io/library/ubuntu:latest"} +{"type":"text","level":1,"timestamp":1764589424871,"text":">"} +{"type":"text","level":1,"timestamp":1764589424871,"text":"> resource: docker.io/library/ubuntu"} +{"type":"text","level":1,"timestamp":1764589424871,"text":"> id: ubuntu"} +{"type":"text","level":1,"timestamp":1764589424871,"text":"> owner: library"} +{"type":"text","level":1,"timestamp":1764589424871,"text":"> namespace: library"} +{"type":"text","level":1,"timestamp":1764589424871,"text":"> registry: docker.io"} +{"type":"text","level":1,"timestamp":1764589424871,"text":"> path: library/ubuntu"} +{"type":"text","level":1,"timestamp":1764589424871,"text":">"} +{"type":"text","level":1,"timestamp":1764589424871,"text":"> version: latest"} +{"type":"text","level":1,"timestamp":1764589424871,"text":"> tag?: latest"} +{"type":"text","level":1,"timestamp":1764589424871,"text":"> digest?: undefined"} +{"type":"text","level":1,"timestamp":1764589424871,"text":"manifest url: https://registry-1.docker.io/v2/library/ubuntu/manifests/latest"} +{"type":"text","level":1,"timestamp":1764589425225,"text":"[httpOci] Attempting to authenticate via 'Bearer' auth."} +{"type":"text","level":1,"timestamp":1764589425228,"text":"[httpOci] Invoking platform default credential helper 'secret'"} +{"type":"start","level":2,"timestamp":1764589425228,"text":"Run: docker-credential-secret get"} +{"type":"stop","level":2,"timestamp":1764589425232,"text":"Run: docker-credential-secret get","startTimestamp":1764589425228} +{"type":"text","level":1,"timestamp":1764589425232,"text":"[httpOci] Failed to query for 'docker.io' credential from 'docker-credential-secret': Error: write EPIPE"} +{"type":"text","level":1,"timestamp":1764589425232,"text":"[httpOci] No authentication credentials found for registry 'docker.io' via docker config or credential helper."} +{"type":"text","level":1,"timestamp":1764589425232,"text":"[httpOci] No authentication credentials found for registry 'docker.io'. Accessing anonymously."} +{"type":"text","level":1,"timestamp":1764589425232,"text":"[httpOci] Attempting to fetch bearer token from: https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/ubuntu:pull"} +{"type":"stop","level":2,"timestamp":1764589425235,"text":"Run: docker-credential-secret get","startTimestamp":1764589425228} +{"type":"text","level":1,"timestamp":1764589425981,"text":"[httpOci] 200 on reattempt after auth: https://registry-1.docker.io/v2/library/ubuntu/manifests/latest"} +{"type":"text","level":1,"timestamp":1764589425981,"text":"[httpOci] Applying cachedAuthHeader for registry docker.io..."} +{"type":"text","level":1,"timestamp":1764589426327,"text":"[httpOci] 200 (Cached): https://registry-1.docker.io/v2/library/ubuntu/manifests/latest"} +{"type":"text","level":1,"timestamp":1764589426327,"text":"Fetched: {\n \"manifests\": [\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"amd64\",\n \"org.opencontainers.image.base.name\": \"scratch\",\n \"org.opencontainers.image.created\": \"2025-10-13T00:00:00Z\",\n \"org.opencontainers.image.revision\": \"6177ca63f5beee0b6d2993721a62850b9146e474\",\n \"org.opencontainers.image.source\": \"https://git.launchpad.net/cloud-images/+oci/ubuntu-base\",\n \"org.opencontainers.image.url\": \"https://hub.docker.com/_/ubuntu\",\n \"org.opencontainers.image.version\": \"24.04\"\n },\n \"digest\": \"sha256:4fdf0125919d24aec972544669dcd7d6a26a8ad7e6561c73d5549bd6db258ac2\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"amd64\",\n \"os\": \"linux\"\n },\n \"size\": 424\n },\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"amd64\",\n \"vnd.docker.reference.digest\": \"sha256:4fdf0125919d24aec972544669dcd7d6a26a8ad7e6561c73d5549bd6db258ac2\",\n \"vnd.docker.reference.type\": \"attestation-manifest\"\n },\n \"digest\": \"sha256:6e7b17d6343f82de4aacb5687ded76f57aedf457e2906011093d98dfa4d11db4\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"unknown\",\n \"os\": \"unknown\"\n },\n \"size\": 562\n },\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"arm32v7\",\n \"org.opencontainers.image.base.name\": \"scratch\",\n \"org.opencontainers.image.created\": \"2025-10-13T00:00:00Z\",\n \"org.opencontainers.image.revision\": \"de0d9a49d887c41c28a7531bd6fd66fe1e4b7c8d\",\n \"org.opencontainers.image.source\": \"https://git.launchpad.net/cloud-images/+oci/ubuntu-base\",\n \"org.opencontainers.image.url\": \"https://hub.docker.com/_/ubuntu\",\n \"org.opencontainers.image.version\": \"24.04\"\n },\n \"digest\": \"sha256:2c10616b6b484ec585fbfd4a351bb762a7d7bccd759b2e7f0ed35afef33c1272\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"arm\",\n \"os\": \"linux\",\n \"variant\": \"v7\"\n },\n \"size\": 424\n },\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"arm32v7\",\n \"vnd.docker.reference.digest\": \"sha256:2c10616b6b484ec585fbfd4a351bb762a7d7bccd759b2e7f0ed35afef33c1272\",\n \"vnd.docker.reference.type\": \"attestation-manifest\"\n },\n \"digest\": \"sha256:c5109367b30046cfeac4b88b19809ae053fc7b84e15a1153a1886c47595b8ecf\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"unknown\",\n \"os\": \"unknown\"\n },\n \"size\": 562\n },\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"arm64v8\",\n \"org.opencontainers.image.base.name\": \"scratch\",\n \"org.opencontainers.image.created\": \"2025-10-13T00:00:00Z\",\n \"org.opencontainers.image.revision\": \"6a6dcf572c9f82db1cd393585928a5c03e151308\",\n \"org.opencontainers.image.source\": \"https://git.launchpad.net/cloud-images/+oci/ubuntu-base\",\n \"org.opencontainers.image.url\": \"https://hub.docker.com/_/ubuntu\",\n \"org.opencontainers.image.version\": \"24.04\"\n },\n \"digest\": \"sha256:955364933d0d91afa6e10fb045948c16d2b191114aa54bed3ab5430d8bbc58cc\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"arm64\",\n \"os\": \"linux\",\n \"variant\": \"v8\"\n },\n \"size\": 424\n },\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"arm64v8\",\n \"vnd.docker.reference.digest\": \"sha256:955364933d0d91afa6e10fb045948c16d2b191114aa54bed3ab5430d8bbc58cc\",\n \"vnd.docker.reference.type\": \"attestation-manifest\"\n },\n \"digest\": \"sha256:dc73e9c67db8d3cfe11ecaf19c37b072333c153e248ca9f80b060130a19f81a4\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"unknown\",\n \"os\": \"unknown\"\n },\n \"size\": 562\n },\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"ppc64le\",\n \"org.opencontainers.image.base.name\": \"scratch\",\n \"org.opencontainers.image.created\": \"2025-10-13T00:00:00Z\",\n \"org.opencontainers.image.revision\": \"faaf0d1a3be388617cdab000bdf34698f0e3a312\",\n \"org.opencontainers.image.source\": \"https://git.launchpad.net/cloud-images/+oci/ubuntu-base\",\n \"org.opencontainers.image.url\": \"https://hub.docker.com/_/ubuntu\",\n \"org.opencontainers.image.version\": \"24.04\"\n },\n \"digest\": \"sha256:1a18086d62ae9a5b621d86903a325791f63d4ff87fbde7872b9d0dea549c5ca0\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"ppc64le\",\n \"os\": \"linux\"\n },\n \"size\": 424\n },\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"ppc64le\",\n \"vnd.docker.reference.digest\": \"sha256:1a18086d62ae9a5b621d86903a325791f63d4ff87fbde7872b9d0dea549c5ca0\",\n \"vnd.docker.reference.type\": \"attestation-manifest\"\n },\n \"digest\": \"sha256:c3adc14357d104d96e557f427833b2ecec936d2fcad2956bc3ea5a3fdab871f4\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"unknown\",\n \"os\": \"unknown\"\n },\n \"size\": 562\n },\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"riscv64\",\n \"org.opencontainers.image.base.name\": \"scratch\",\n \"org.opencontainers.image.created\": \"2025-10-13T00:00:00Z\",\n \"org.opencontainers.image.revision\": \"c1f21c0a17e987239d074b9b8f36a5430912c879\",\n \"org.opencontainers.image.source\": \"https://git.launchpad.net/cloud-images/+oci/ubuntu-base\",\n \"org.opencontainers.image.url\": \"https://hub.docker.com/_/ubuntu\",\n \"org.opencontainers.image.version\": \"24.04\"\n },\n \"digest\": \"sha256:d367e0e76fde2154b96eb2e234b3e3dc852fe73c2f92d1527adbd3b2dca5e772\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"riscv64\",\n \"os\": \"linux\"\n },\n \"size\": 424\n },\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"riscv64\",\n \"vnd.docker.reference.digest\": \"sha256:d367e0e76fde2154b96eb2e234b3e3dc852fe73c2f92d1527adbd3b2dca5e772\",\n \"vnd.docker.reference.type\": \"attestation-manifest\"\n },\n \"digest\": \"sha256:f485eb24ada4307a2a4adbb9cec4959f6a3f3644072f586240e2c45593a01178\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"unknown\",\n \"os\": \"unknown\"\n },\n \"size\": 562\n },\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"s390x\",\n \"org.opencontainers.image.base.name\": \"scratch\",\n \"org.opencontainers.image.created\": \"2025-10-13T00:00:00Z\",\n \"org.opencontainers.image.revision\": \"083722f1b9a3277e0964c4787713cf1b4f6f3aa0\",\n \"org.opencontainers.image.source\": \"https://git.launchpad.net/cloud-images/+oci/ubuntu-base\",\n \"org.opencontainers.image.url\": \"https://hub.docker.com/_/ubuntu\",\n \"org.opencontainers.image.version\": \"24.04\"\n },\n \"digest\": \"sha256:ca49f3a4aa176966d7353046c384a0fc82e2621a99e5b40402a5552d071732fe\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"s390x\",\n \"os\": \"linux\"\n },\n \"size\": 424\n },\n {\n \"annotations\": {\n \"com.docker.official-images.bashbrew.arch\": \"s390x\",\n \"vnd.docker.reference.digest\": \"sha256:ca49f3a4aa176966d7353046c384a0fc82e2621a99e5b40402a5552d071732fe\",\n \"vnd.docker.reference.type\": \"attestation-manifest\"\n },\n \"digest\": \"sha256:a285672b69b103cad9e18a9a87da761b38cf5669de41e22885baf035b892ab35\",\n \"mediaType\": \"application/vnd.oci.image.manifest.v1+json\",\n \"platform\": {\n \"architecture\": \"unknown\",\n \"os\": \"unknown\"\n },\n \"size\": 562\n }\n ],\n \"mediaType\": \"application/vnd.oci.image.index.v1+json\",\n \"schemaVersion\": 2\n}"} +{"type":"text","level":1,"timestamp":1764589426327,"text":"[httpOci] Applying cachedAuthHeader for registry docker.io..."} +{"type":"text","level":1,"timestamp":1764589426670,"text":"[httpOci] 200 (Cached): https://registry-1.docker.io/v2/library/ubuntu/manifests/sha256:4fdf0125919d24aec972544669dcd7d6a26a8ad7e6561c73d5549bd6db258ac2"} +{"type":"text","level":1,"timestamp":1764589426670,"text":"blob url: https://registry-1.docker.io/v2/library/ubuntu/blobs/sha256:c3a134f2ace4f6d480733efcfef27c60ea8ed48be1cd36f2c17ec0729775b2c8"} +{"type":"text","level":1,"timestamp":1764589426670,"text":"[httpOci] Applying cachedAuthHeader for registry docker.io..."} +{"type":"text","level":1,"timestamp":1764589427193,"text":"[httpOci] 200 (Cached): https://registry-1.docker.io/v2/library/ubuntu/blobs/sha256:c3a134f2ace4f6d480733efcfef27c60ea8ed48be1cd36f2c17ec0729775b2c8"} +{"type":"text","level":1,"timestamp":1764589427194,"text":"workspace root: /tmp/devcontainer-test"} +{"type":"text","level":1,"timestamp":1764589427195,"text":"No user features to update"} +{"type":"start","level":2,"timestamp":1764589427197,"text":"Run: docker events --format {{json .}} --filter event=start"} +{"type":"start","level":2,"timestamp":1764589427202,"text":"Starting container"} +{"type":"start","level":3,"timestamp":1764589427203,"text":"Run: docker run --sig-proxy=false -a STDOUT -a STDERR --mount type=bind,source=/tmp/devcontainer-test,target=/workspaces/devcontainer-test -l devcontainer.local_folder=/tmp/devcontainer-test -l devcontainer.config_file=/tmp/devcontainer-test/.devcontainer/devcontainer.json --entrypoint /bin/sh -l devcontainer.metadata=[{\"postCreateCommand\":\"exit 1\"}] ubuntu:latest -c echo Container started"} +{"type":"raw","level":3,"timestamp":1764589427221,"text":"Unable to find image 'ubuntu:latest' locally\n"} +{"type":"raw","level":3,"timestamp":1764589427703,"text":"latest: Pulling from library/ubuntu\n"} +{"type":"raw","level":3,"timestamp":1764589427812,"text":"20043066d3d5: Already exists\n"} +{"type":"raw","level":3,"timestamp":1764589428034,"text":"Digest: sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54\n"} +{"type":"raw","level":3,"timestamp":1764589428036,"text":"Status: Downloaded newer image for ubuntu:latest\n"} +{"type":"raw","level":3,"timestamp":1764589428384,"text":"Container started\n"} +{"type":"stop","level":2,"timestamp":1764589428385,"text":"Starting container","startTimestamp":1764589427202} +{"type":"start","level":2,"timestamp":1764589428385,"text":"Run: docker ps -q -a --filter label=devcontainer.local_folder=/tmp/devcontainer-test --filter label=devcontainer.config_file=/tmp/devcontainer-test/.devcontainer/devcontainer.json"} +{"type":"stop","level":2,"timestamp":1764589428387,"text":"Run: docker events --format {{json .}} --filter event=start","startTimestamp":1764589427197} +{"type":"stop","level":2,"timestamp":1764589428402,"text":"Run: docker ps -q -a --filter label=devcontainer.local_folder=/tmp/devcontainer-test --filter label=devcontainer.config_file=/tmp/devcontainer-test/.devcontainer/devcontainer.json","startTimestamp":1764589428385} +{"type":"start","level":2,"timestamp":1764589428402,"text":"Run: docker inspect --type container ef4321ff27fe"} +{"type":"stop","level":2,"timestamp":1764589428419,"text":"Run: docker inspect --type container ef4321ff27fe","startTimestamp":1764589428402} +{"type":"start","level":2,"timestamp":1764589428420,"text":"Inspecting container"} +{"type":"start","level":2,"timestamp":1764589428420,"text":"Run: docker inspect --type container ef4321ff27fe57da7b2d5a047d181ae059cc75029ec6efaabd8f725f9d5a82aa"} +{"type":"stop","level":2,"timestamp":1764589428437,"text":"Run: docker inspect --type container ef4321ff27fe57da7b2d5a047d181ae059cc75029ec6efaabd8f725f9d5a82aa","startTimestamp":1764589428420} +{"type":"stop","level":2,"timestamp":1764589428437,"text":"Inspecting container","startTimestamp":1764589428420} +{"type":"start","level":2,"timestamp":1764589428439,"text":"Run in container: /bin/sh"} +{"type":"start","level":2,"timestamp":1764589428442,"text":"Run in container: uname -m"} +{"type":"text","level":2,"timestamp":1764589428512,"text":"x86_64\n"} +{"type":"text","level":2,"timestamp":1764589428512,"text":""} +{"type":"stop","level":2,"timestamp":1764589428512,"text":"Run in container: uname -m","startTimestamp":1764589428442} +{"type":"start","level":2,"timestamp":1764589428513,"text":"Run in container: (cat /etc/os-release || cat /usr/lib/os-release) 2>/dev/null"} +{"type":"text","level":2,"timestamp":1764589428514,"text":"PRETTY_NAME=\"Ubuntu 24.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"24.04\"\nVERSION=\"24.04.3 LTS (Noble Numbat)\"\nVERSION_CODENAME=noble\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=noble\nLOGO=ubuntu-logo\n"} +{"type":"text","level":2,"timestamp":1764589428515,"text":""} +{"type":"stop","level":2,"timestamp":1764589428515,"text":"Run in container: (cat /etc/os-release || cat /usr/lib/os-release) 2>/dev/null","startTimestamp":1764589428513} +{"type":"start","level":2,"timestamp":1764589428515,"text":"Run in container: (command -v getent >/dev/null 2>&1 && getent passwd 'root' || grep -E '^root|^[^:]*:[^:]*:root:' /etc/passwd || true)"} +{"type":"stop","level":2,"timestamp":1764589428518,"text":"Run in container: (command -v getent >/dev/null 2>&1 && getent passwd 'root' || grep -E '^root|^[^:]*:[^:]*:root:' /etc/passwd || true)","startTimestamp":1764589428515} +{"type":"start","level":2,"timestamp":1764589428519,"text":"Run in container: test -f '/var/devcontainer/.patchEtcEnvironmentMarker'"} +{"type":"text","level":2,"timestamp":1764589428520,"text":""} +{"type":"text","level":2,"timestamp":1764589428520,"text":""} +{"type":"text","level":2,"timestamp":1764589428520,"text":"Exit code 1"} +{"type":"stop","level":2,"timestamp":1764589428520,"text":"Run in container: test -f '/var/devcontainer/.patchEtcEnvironmentMarker'","startTimestamp":1764589428519} +{"type":"start","level":2,"timestamp":1764589428520,"text":"Run in container: test ! -f '/var/devcontainer/.patchEtcEnvironmentMarker' && set -o noclobber && mkdir -p '/var/devcontainer' && { > '/var/devcontainer/.patchEtcEnvironmentMarker' ; } 2> /dev/null"} +{"type":"text","level":2,"timestamp":1764589428522,"text":""} +{"type":"text","level":2,"timestamp":1764589428522,"text":""} +{"type":"stop","level":2,"timestamp":1764589428522,"text":"Run in container: test ! -f '/var/devcontainer/.patchEtcEnvironmentMarker' && set -o noclobber && mkdir -p '/var/devcontainer' && { > '/var/devcontainer/.patchEtcEnvironmentMarker' ; } 2> /dev/null","startTimestamp":1764589428520} +{"type":"start","level":2,"timestamp":1764589428522,"text":"Run in container: cat >> /etc/environment <<'etcEnvironmentEOF'"} +{"type":"text","level":2,"timestamp":1764589428524,"text":""} +{"type":"text","level":2,"timestamp":1764589428525,"text":""} +{"type":"stop","level":2,"timestamp":1764589428525,"text":"Run in container: cat >> /etc/environment <<'etcEnvironmentEOF'","startTimestamp":1764589428522} +{"type":"start","level":2,"timestamp":1764589428525,"text":"Run in container: test -f '/var/devcontainer/.patchEtcProfileMarker'"} +{"type":"text","level":2,"timestamp":1764589428525,"text":""} +{"type":"text","level":2,"timestamp":1764589428525,"text":""} +{"type":"text","level":2,"timestamp":1764589428525,"text":"Exit code 1"} +{"type":"stop","level":2,"timestamp":1764589428525,"text":"Run in container: test -f '/var/devcontainer/.patchEtcProfileMarker'","startTimestamp":1764589428525} +{"type":"start","level":2,"timestamp":1764589428525,"text":"Run in container: test ! -f '/var/devcontainer/.patchEtcProfileMarker' && set -o noclobber && mkdir -p '/var/devcontainer' && { > '/var/devcontainer/.patchEtcProfileMarker' ; } 2> /dev/null"} +{"type":"text","level":2,"timestamp":1764589428527,"text":""} +{"type":"text","level":2,"timestamp":1764589428527,"text":""} +{"type":"stop","level":2,"timestamp":1764589428527,"text":"Run in container: test ! -f '/var/devcontainer/.patchEtcProfileMarker' && set -o noclobber && mkdir -p '/var/devcontainer' && { > '/var/devcontainer/.patchEtcProfileMarker' ; } 2> /dev/null","startTimestamp":1764589428525} +{"type":"start","level":2,"timestamp":1764589428527,"text":"Run in container: sed -i -E 's/((^|\\s)PATH=)([^\\$]*)$/\\1${PATH:-\\3}/g' /etc/profile || true"} +{"type":"text","level":2,"timestamp":1764589428529,"text":""} +{"type":"text","level":2,"timestamp":1764589428529,"text":""} +{"type":"stop","level":2,"timestamp":1764589428529,"text":"Run in container: sed -i -E 's/((^|\\s)PATH=)([^\\$]*)$/\\1${PATH:-\\3}/g' /etc/profile || true","startTimestamp":1764589428527} +{"type":"text","level":2,"timestamp":1764589428529,"text":"userEnvProbe: loginInteractiveShell (default)"} +{"type":"text","level":1,"timestamp":1764589428529,"text":"LifecycleCommandExecutionMap: {\n \"onCreateCommand\": [],\n \"updateContentCommand\": [],\n \"postCreateCommand\": [\n {\n \"origin\": \"devcontainer.json\",\n \"command\": \"exit 1\"\n }\n ],\n \"postStartCommand\": [],\n \"postAttachCommand\": [],\n \"initializeCommand\": []\n}"} +{"type":"text","level":2,"timestamp":1764589428529,"text":"userEnvProbe: not found in cache"} +{"type":"text","level":2,"timestamp":1764589428529,"text":"userEnvProbe shell: /bin/bash"} +{"type":"start","level":2,"timestamp":1764589428529,"text":"Run in container: /bin/bash -lic echo -n 3065b502-2348-4640-9ad4-8a65a6b729f6; cat /proc/self/environ; echo -n 3065b502-2348-4640-9ad4-8a65a6b729f6"} +{"type":"start","level":2,"timestamp":1764589428530,"text":"Run in container: mkdir -p '/root/.devcontainer' && CONTENT=\"$(cat '/root/.devcontainer/.onCreateCommandMarker' 2>/dev/null || echo ENOENT)\" && [ \"${CONTENT:-2025-12-01T11:43:48.038307592Z}\" != '2025-12-01T11:43:48.038307592Z' ] && echo '2025-12-01T11:43:48.038307592Z' > '/root/.devcontainer/.onCreateCommandMarker'"} +{"type":"text","level":2,"timestamp":1764589428533,"text":""} +{"type":"text","level":2,"timestamp":1764589428533,"text":""} +{"type":"stop","level":2,"timestamp":1764589428533,"text":"Run in container: mkdir -p '/root/.devcontainer' && CONTENT=\"$(cat '/root/.devcontainer/.onCreateCommandMarker' 2>/dev/null || echo ENOENT)\" && [ \"${CONTENT:-2025-12-01T11:43:48.038307592Z}\" != '2025-12-01T11:43:48.038307592Z' ] && echo '2025-12-01T11:43:48.038307592Z' > '/root/.devcontainer/.onCreateCommandMarker'","startTimestamp":1764589428530} +{"type":"start","level":2,"timestamp":1764589428533,"text":"Run in container: mkdir -p '/root/.devcontainer' && CONTENT=\"$(cat '/root/.devcontainer/.updateContentCommandMarker' 2>/dev/null || echo ENOENT)\" && [ \"${CONTENT:-2025-12-01T11:43:48.038307592Z}\" != '2025-12-01T11:43:48.038307592Z' ] && echo '2025-12-01T11:43:48.038307592Z' > '/root/.devcontainer/.updateContentCommandMarker'"} +{"type":"text","level":2,"timestamp":1764589428537,"text":""} +{"type":"text","level":2,"timestamp":1764589428537,"text":""} +{"type":"stop","level":2,"timestamp":1764589428537,"text":"Run in container: mkdir -p '/root/.devcontainer' && CONTENT=\"$(cat '/root/.devcontainer/.updateContentCommandMarker' 2>/dev/null || echo ENOENT)\" && [ \"${CONTENT:-2025-12-01T11:43:48.038307592Z}\" != '2025-12-01T11:43:48.038307592Z' ] && echo '2025-12-01T11:43:48.038307592Z' > '/root/.devcontainer/.updateContentCommandMarker'","startTimestamp":1764589428533} +{"type":"start","level":2,"timestamp":1764589428537,"text":"Run in container: mkdir -p '/root/.devcontainer' && CONTENT=\"$(cat '/root/.devcontainer/.postCreateCommandMarker' 2>/dev/null || echo ENOENT)\" && [ \"${CONTENT:-2025-12-01T11:43:48.038307592Z}\" != '2025-12-01T11:43:48.038307592Z' ] && echo '2025-12-01T11:43:48.038307592Z' > '/root/.devcontainer/.postCreateCommandMarker'"} +{"type":"text","level":2,"timestamp":1764589428539,"text":""} +{"type":"text","level":2,"timestamp":1764589428540,"text":""} +{"type":"stop","level":2,"timestamp":1764589428540,"text":"Run in container: mkdir -p '/root/.devcontainer' && CONTENT=\"$(cat '/root/.devcontainer/.postCreateCommandMarker' 2>/dev/null || echo ENOENT)\" && [ \"${CONTENT:-2025-12-01T11:43:48.038307592Z}\" != '2025-12-01T11:43:48.038307592Z' ] && echo '2025-12-01T11:43:48.038307592Z' > '/root/.devcontainer/.postCreateCommandMarker'","startTimestamp":1764589428537} +{"type":"raw","level":3,"timestamp":1764589428540,"text":"\u001b[1mRunning the postCreateCommand from devcontainer.json...\u001b[0m\r\n\r\n","channel":"postCreate"} +{"type":"progress","name":"Running postCreateCommand...","status":"running","stepDetail":"exit 1","channel":"postCreate"} +{"type":"stop","level":2,"timestamp":1764589428592,"text":"Run in container: /bin/bash -lic echo -n 3065b502-2348-4640-9ad4-8a65a6b729f6; cat /proc/self/environ; echo -n 3065b502-2348-4640-9ad4-8a65a6b729f6","startTimestamp":1764589428529} +{"type":"text","level":1,"timestamp":1764589428592,"text":"3065b502-2348-4640-9ad4-8a65a6b729f6HOSTNAME=ef4321ff27fe\u0000PWD=/\u0000HOME=/root\u0000LS_COLORS=\u0000SHLVL=1\u0000PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\u0000_=/usr/bin/cat\u00003065b502-2348-4640-9ad4-8a65a6b729f6"} +{"type":"text","level":1,"timestamp":1764589428592,"text":"\u001b[1m\u001b[31mbash: cannot set terminal process group (-1): Inappropriate ioctl for device\u001b[39m\u001b[22m\r\n\u001b[1m\u001b[31mbash: no job control in this shell\u001b[39m\u001b[22m\r\n\u001b[1m\u001b[31m\u001b[39m\u001b[22m\r\n"} +{"type":"text","level":1,"timestamp":1764589428592,"text":"userEnvProbe parsed: {\n \"HOSTNAME\": \"ef4321ff27fe\",\n \"PWD\": \"/\",\n \"HOME\": \"/root\",\n \"LS_COLORS\": \"\",\n \"SHLVL\": \"1\",\n \"PATH\": \"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n \"_\": \"/usr/bin/cat\"\n}"} +{"type":"text","level":2,"timestamp":1764589428592,"text":"userEnvProbe PATHs:\nProbe: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'\nContainer: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'"} +{"type":"start","level":2,"timestamp":1764589428593,"text":"Run in container: /bin/sh -c exit 1","channel":"postCreate"} +{"type":"stop","level":2,"timestamp":1764589428658,"text":"Run in container: /bin/sh -c exit 1","startTimestamp":1764589428593,"channel":"postCreate"} +{"type":"text","level":3,"timestamp":1764589428659,"text":"\u001b[1m\u001b[31mpostCreateCommand from devcontainer.json failed with exit code 1. Skipping any further user-provided commands.\u001b[39m\u001b[22m\r\n","channel":"postCreate"} +{"type":"progress","name":"Running postCreateCommand...","status":"failed","channel":"postCreate"} +Error: Command failed: /bin/sh -c exit 1 + at E (/home/coder/.config/yarn/global/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:235:157) + at process.processTicksAndRejections (node:internal/process/task_queues:105:5) + at async Promise.allSettled (index 0) + at async b9 (/home/coder/.config/yarn/global/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:237:119) + at async ND (/home/coder/.config/yarn/global/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:226:4668) + at async RD (/home/coder/.config/yarn/global/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:226:4013) + at async MD (/home/coder/.config/yarn/global/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:226:3217) + at async Zg (/home/coder/.config/yarn/global/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:226:2623) + at async m6 (/home/coder/.config/yarn/global/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:467:1526) + at async ax (/home/coder/.config/yarn/global/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:467:960) +{"outcome":"error","message":"Command failed: /bin/sh -c exit 1","description":"postCreateCommand from devcontainer.json failed.","containerId":"ef4321ff27fe57da7b2d5a047d181ae059cc75029ec6efaabd8f725f9d5a82aa"}