Skip to content

Commit 80184d9

Browse files
committed
Fix project name with env variable (#839)
1 parent c5fdefe commit 80184d9

File tree

4 files changed

+69
-10
lines changed

4 files changed

+69
-10
lines changed

src/spec-node/dockerCompose.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -654,16 +654,20 @@ export async function getProjectName(params: DockerCLIParameters | DockerResolve
654654
throw err;
655655
}
656656
}
657-
for (let i = composeFiles.length - 1; i >= 0; i--) {
658-
try {
659-
const fragment = yaml.load((await cliHost.readFile(composeFiles[i])).toString()) || {} as any;
660-
if (fragment.name) {
661-
return toProjectName(fragment.name, newProjectName);
662-
}
663-
} catch (error) {
664-
// fallback when parsing fails due to custom yaml tags (e.g., !reset)
665-
if (composeConfig?.name && composeConfig.name !== 'devcontainer') {
666-
return toProjectName(composeConfig.name, newProjectName);
657+
if (composeConfig?.name) {
658+
if (composeConfig.name !== 'devcontainer') {
659+
return toProjectName(composeConfig.name, newProjectName);
660+
}
661+
// Check if 'devcontainer' is from a compose file or just the default.
662+
for (let i = composeFiles.length - 1; i >= 0; i--) {
663+
try {
664+
const fragment = yaml.load((await cliHost.readFile(composeFiles[i])).toString()) || {} as any;
665+
if (fragment.name) {
666+
// Use composeConfig.name ('devcontainer') because fragment.name could include environment variables.
667+
return toProjectName(composeConfig.name, newProjectName);
668+
}
669+
} catch (error) {
670+
// Ignore when parsing fails due to custom yaml tags (e.g., !reset)
667671
}
668672
}
669673
}

src/test/cli.up.test.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,46 @@ describe('Dev Containers CLI', function () {
105105
assert.equal(upResult!.composeProjectName, 'custom-project-name');
106106
});
107107
});
108+
describe('for minimal docker-compose with custom project name using environment variable', () => {
109+
let upResult: UpResult | null = null;
110+
const testFolder = `${__dirname}/configs/compose-with-name-using-env-var`;
111+
before(async () => {
112+
// build and start the container
113+
upResult = await devContainerUp(cli, testFolder, {
114+
logLevel: 'trace',
115+
extraArgs: `--docker-compose-path trigger-compose-v2`,
116+
env: {
117+
...process.env,
118+
'CUSTOM_NAME': 'custom-name-with-env-var'
119+
}
120+
});
121+
});
122+
after(async () => await devContainerDown({ composeProjectName: upResult?.composeProjectName }));
123+
it('should succeed', () => {
124+
assert.equal(upResult!.outcome, 'success');
125+
assert.equal(upResult!.composeProjectName, 'custom-name-with-env-var');
126+
});
127+
});
128+
describe('for minimal docker-compose with custom project name "devcontainer" using environment variable', () => {
129+
let upResult: UpResult | null = null;
130+
const testFolder = `${__dirname}/configs/compose-with-name-using-env-var`;
131+
before(async () => {
132+
// build and start the container
133+
upResult = await devContainerUp(cli, testFolder, {
134+
logLevel: 'trace',
135+
extraArgs: `--docker-compose-path trigger-compose-v2`,
136+
env: {
137+
...process.env,
138+
'CUSTOM_NAME': 'devcontainer'
139+
}
140+
});
141+
});
142+
after(async () => await devContainerDown({ composeProjectName: upResult?.composeProjectName }));
143+
it('should succeed', () => {
144+
assert.equal(upResult!.outcome, 'success');
145+
assert.equal(upResult!.composeProjectName, 'devcontainer');
146+
});
147+
});
108148
describe('for minimal docker-compose with custom project name and custom yaml', () => {
109149
let upResult: UpResult | null = null;
110150
const testFolder = `${__dirname}/configs/compose-with-name-and-custom-yaml`;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"dockerComposeFile": "docker-compose.yml",
3+
"service": "app",
4+
"workspaceFolder": "/workspace"
5+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
version: '3.8'
2+
3+
name: ${CUSTOM_NAME}
4+
5+
services:
6+
app:
7+
image: ubuntu:latest
8+
volumes:
9+
- ..:/workspace:cached
10+
command: sleep infinity

0 commit comments

Comments
 (0)