{"record":{"id":"4d4d70b45f751dc9","repo":"theonedev/onedev","slug":"this-workspace-can-only-be-provisioned-by-shell-pr","errorCode":null,"errorMessage":"This workspace can only be provisioned by shell provisioner","messagePattern":"This workspace can only be provisioned by shell provisioner","errorType":"exception","errorClass":"ExplicitException","httpStatus":null,"severity":"error","filePath":"server-plugin/server-plugin-provisioner-serverdocker/src/main/java/io/onedev/server/plugin/provisioner/serverdocker/ServerDockerProvisioner.java","lineNumber":296,"sourceCode":"\t\t@Editable\n\t\t@OmitName\n\t\t@NotEmpty\n\t\tpublic String getDockerImage() {\n\t\t\treturn dockerImage;\n\t\t}\n\n\t\tpublic void setDockerImage(String dockerImage) {\n\t\t\tthis.dockerImage = dockerImage;\n\t\t}\n\n\t}\n\n\t@Override\n\tpublic WorkspaceRuntime provision(WorkspaceContext context, TaskLogger workspaceLogger) {\t\t\n\t\tcheckApplicable();\n\n\t\tif (!context.getSpec().isRunInContainer()) \n\t\t\tthrow new ExplicitException(\"This workspace can only be provisioned by shell provisioner\");\n\n\t\tvar serverAddress = getClusterService().getLocalServerAddress();\n\t\tworkspaceLogger.log(\"Provisioning workspace on server '\" + serverAddress + \"'...\");\n\t\tServerProvisionerUtils.persistServerAddress(context.getWorkspaceId(), serverAddress);\t\t\n\n\t\tvar workspaceDir = ServerProvisionerUtils.getWorkspaceDir(context);\n\t\tFileUtils.createDir(workspaceDir);\n\n\t\tvar osIds = getOsIds(workspaceLogger);\n\t\tif (SystemUtils.IS_OS_LINUX && !osIds.equals(\"0:0\")) {\n\t\t\tworkspaceLogger.log(\"Changing owner of workspace directory to host user...\");\t\t\n\t\t\tchangeOwner(newDocker(), osIds, workspaceDir, osIds, workspaceLogger);\n\t\t}\n\n\t\tvar allRegistryLogins = getAllRegistryLogins(context);\n\n\t\tvar infoLogger = AgentUtils.newInfoLogger(workspaceLogger);\n\t\tvar warningLogger = AgentUtils.newWarningLogger(workspaceLogger);","sourceCodeStart":278,"sourceCodeEnd":314,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-plugin/server-plugin-provisioner-serverdocker/src/main/java/io/onedev/server/plugin/provisioner/serverdocker/ServerDockerProvisioner.java#L278-L314","documentation":"ServerDockerProvisioner.provision throws ExplicitException when the workspace spec has isRunInContainer() == false. A spec that does not run in a container must be handled by the shell provisioner, not the server docker provisioner.","triggerScenarios":"A workspace/build spec whose environment is configured to run on the server directly (no container image) but is assigned to the Server Docker provisioner.","commonSituations":"Spec created for server-shell execution later reassigned to docker provisioner; copy-pasted workspace config without setting an image/run-in-container flag.","solutions":["Enable 'run in container' and set a docker image on the workspace spec","Or switch the workspace's provisioner to Server Shell provisioner","Re-run the workspace provisioning after updating the spec"],"exampleFix":"// before\nspec.setRunInContainer(false); // assigned to ServerDockerProvisioner\n// after\nspec.setRunInContainer(true);\nspec.setImage(\"python:3.11\");","handlingStrategy":"validation","validationCode":"if (!context.getSpec().isRunInContainer()) { throw new IllegalStateException('Assign this workspace to the Server Shell provisioner or enable runInContainer'); }","typeGuard":null,"tryCatchPattern":"try { provisioner.provision(context, logger); } catch (ExplicitException e) { if (e.getMessage().contains('shell provisioner')) switchProvisionerOrFixSpec(); else throw e; }","preventionTips":["Match provisioner type to the workspace spec's run-in-container setting","Set a container image whenever using docker-based provisioners","Review workspace specs after copying configs between projects"],"tags":["provisioner","configuration","docker"],"backgroundTag":"invalid-config-value","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}