Skip to content

Commit 6840078

Browse files
committed
Omit --userns=keep-id for root (#1004)
1 parent c246645 commit 6840078

File tree

3 files changed

+15
-6
lines changed

3 files changed

+15
-6
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
Notable changes.
44

5+
## May 2025
6+
7+
### [0.77.0]
8+
- Fix: --uidmap/--gidmap conflict with --userns (https://github.com/microsoft/vscode-remote-release/10954)
9+
- Fix: Omit --userns=keep-id for root (https://github.com/devcontainers/cli/pull/1004)
10+
511
## April 2025
612

713
### [0.76.0]

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@devcontainers/cli",
33
"description": "Dev Containers CLI",
4-
"version": "0.76.0",
4+
"version": "0.77.0",
55
"bin": {
66
"devcontainer": "devcontainer.js"
77
},

src/spec-node/singleContainer.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ export async function extraRunArgs(common: ResolverParameters, params: DockerRes
344344
return extraArguments;
345345
}
346346

347-
export async function spawnDevContainer(params: DockerResolverParameters, config: DevContainerFromDockerfileConfig | DevContainerFromImageConfig, mergedConfig: MergedDevContainerConfig, imageName: string, labels: string[], workspaceMount: string | undefined, imageDetails: (() => Promise<ImageDetails>) | undefined, containerUser: string | undefined, extraLabels: Record<string, string>) {
347+
export async function spawnDevContainer(params: DockerResolverParameters, config: DevContainerFromDockerfileConfig | DevContainerFromImageConfig, mergedConfig: MergedDevContainerConfig, imageName: string, labels: string[], workspaceMount: string | undefined, imageDetails: () => Promise<ImageDetails>, containerUser: string | undefined, extraLabels: Record<string, string>) {
348348
const { common } = params;
349349
common.progress(ResolverProgress.StartingContainer);
350350

@@ -392,7 +392,7 @@ ${customEntrypoints.join('\n')}
392392
exec "$@"
393393
while sleep 1 & wait $!; do :; done`, '-']; // `wait $!` allows for the `trap` to run (synchronous `sleep` would not).
394394
const overrideCommand = mergedConfig.overrideCommand;
395-
if (overrideCommand === false && imageDetails) {
395+
if (overrideCommand === false) {
396396
const details = await imageDetails();
397397
cmd.push(...details.Config.Entrypoint || []);
398398
cmd.push(...details.Config.Cmd || []);
@@ -409,7 +409,7 @@ while sleep 1 & wait $!; do :; done`, '-']; // `wait $!` allows for the `trap` t
409409
...getLabels(labels),
410410
...containerEnv,
411411
...containerUserArgs,
412-
...getPodmanArgs(params, config),
412+
...await getPodmanArgs(params, config, mergedConfig, imageDetails),
413413
...(config.runArgs || []),
414414
...(await extraRunArgs(common, params, config) || []),
415415
...featureArgs,
@@ -434,12 +434,15 @@ while sleep 1 & wait $!; do :; done`, '-']; // `wait $!` allows for the `trap` t
434434
common.output.stop(text, start);
435435
}
436436

437-
function getPodmanArgs(params: DockerResolverParameters, config: DevContainerFromDockerfileConfig | DevContainerFromImageConfig): string[] {
437+
async function getPodmanArgs(params: DockerResolverParameters, config: DevContainerFromDockerfileConfig | DevContainerFromImageConfig, mergedConfig: MergedDevContainerConfig, imageDetails: () => Promise<ImageDetails>): Promise<string[]> {
438438
if (params.isPodman && params.common.cliHost.platform === 'linux') {
439439
const args = ['--security-opt', 'label=disable'];
440440
const hasIdMapping = (config.runArgs || []).some(arg => /--[ug]idmap(=|$)/.test(arg));
441441
if (!hasIdMapping) {
442-
args.push('--userns=keep-id');
442+
const remoteUser = mergedConfig.remoteUser || findUserArg(config.runArgs) || (await imageDetails()).Config.User || 'root';
443+
if (remoteUser !== 'root' && remoteUser !== '0') {
444+
args.push('--userns=keep-id');
445+
}
443446
}
444447
return args;
445448
}

0 commit comments

Comments
 (0)