diff --git a/envbuilder.go b/envbuilder.go index 307a55dd..f87846c7 100644 --- a/envbuilder.go +++ b/envbuilder.go @@ -342,6 +342,14 @@ func Run(ctx context.Context, options Options) error { } } + if options.PushImage { + // Make sure the Dockerfile is using the correct directives to run envbuilder + buildParams.DockerfileContent = buildParams.DockerfileContent + "\n" + + "USER root \n" + + "WORKDIR / \n" + + "ENTRYPOINT [\"/.envbuilder/bin/envbuilder\"]" + } + HijackLogrus(func(entry *logrus.Entry) { for _, line := range strings.Split(entry.Message, "\r") { options.Logger(notcodersdk.LogLevelInfo, "#%d: %s", stageNumber, color.HiBlackString(line)) diff --git a/integration/integration_test.go b/integration/integration_test.go index 4b0e82e8..6aedf022 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -1354,6 +1354,49 @@ COPY --from=a /root/date.txt /date.txt`, testImageAlpine, testImageAlpine), }) } +func TestDefaultDirectivesOnPushedImage(t *testing.T) { + t.Parallel() + + srv := createGitServer(t, gitServerOptions{ + files: map[string]string{ + ".devcontainer/entrypoint.sh": "#!/bin/sh\necho 'Hello, world!'", + ".devcontainer/Dockerfile": "FROM " + testImageAlpine + "\n" + + "RUN addgroup -S coder && adduser -S coder -G coder \n" + + // These should be overridden by the default directives + "USER coder\n" + + "WORKDIR /app\n" + + "ENTRYPOINT [\"./entrypoint.sh\"]", + ".devcontainer/devcontainer.json": `{ + "name": "Test", + "build": { + "dockerfile": "Dockerfile" + }, + }`, + }, + }) + + testReg := setupInMemoryRegistry(t, setupInMemoryRegistryOpts{}) + testRepo := testReg + "/test" + ref, err := name.ParseReference(testRepo + ":latest") + require.NoError(t, err) + + _, err = runEnvbuilder(t, options{env: []string{ + envbuilderEnv("GIT_URL", srv.URL), + envbuilderEnv("CACHE_REPO", testRepo), + envbuilderEnv("PUSH_IMAGE", "1"), + }}) + require.NoError(t, err) + + image, err := remote.Image(ref) + require.NoError(t, err, "expected image to be present after build + push") + configFile, err := image.ConfigFile() + require.NoError(t, err, "expected image to return a config file") + + require.Equal(t, configFile.Config.User, "root", "value does not match any of the possible root user values.") + require.Equal(t, configFile.Config.WorkingDir, "/", "expected image to have root working directory") + require.Equal(t, configFile.Config.Entrypoint, []string{"/.envbuilder/bin/envbuilder"}, "expected image to have envbuilder entrypoint") +} + type setupInMemoryRegistryOpts struct { Username string Password string