Skip to content

Conversation

@tensorworkerr
Copy link

@tensorworkerr tensorworkerr commented Jan 14, 2026

When using --env-file=/~.env, the tilde was not expanded to the user's home directory. Instead, it was treated as a literal character and resolved relative to the current working directory, resulting in errors like "couldn't find env file: /current/dir/~/.env".

This adds an ExpandUser function that expands ~ to the home directory before converting relative paths to absolute paths.
Fixes #13508

What I did
-Added ExpandUser() function in internal/paths/paths.go that expands a leading ~ to the user's home directory using os.UserHomeDir()
-Updated the env file path processing in cmd/compose/compose.go to call ExpandUser() before checking if paths are absolute
-Added unit tests for the new function covering various edge cases (empty string, ~ only, ~/.env, ~/subdir/.env, absolute paths, relative paths, tilde in middle of path, ~otheruser/... syntax)

Related issue
Fixes #13508

Contribution by Gittensor, see my contribution statistics at https://gittensor.io/miners/details?githubId=178221229

@tensorworkerr tensorworkerr requested a review from a team as a code owner January 14, 2026 03:31
// ExpandUser expands a leading tilde (~) in a path to the user's home directory.
// If the path doesn't start with ~, it is returned unchanged.
// If the home directory cannot be determined, the original path is returned.
func ExpandUser(path string) string {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can use paths.ExpandUser from compose-go

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated as you suggested.

@ndeloof
Copy link
Contributor

ndeloof commented Jan 14, 2026

A better place to fix this is GetEnvFromFile in compose-go: relativePathsResolver already manages this for usage within a compose file as file attributes, would make sense to have this logic all in one place

@tensorworkerr tensorworkerr requested a review from ndeloof January 14, 2026 23:59
@tensorworkerr tensorworkerr force-pushed the fix-env-file-tilde-expansion branch from cb64f55 to 3f2191b Compare January 15, 2026 00:02
When using --env-file=~/.env, the tilde was not expanded to the user's
home directory. Instead, it was treated as a literal character and
resolved relative to the current working directory, resulting in errors
like "couldn't find env file: /current/dir/~/.env".

This adds an ExpandUser function that expands ~ to the home directory
before converting relative paths to absolute paths.

Fixes docker#13508

Signed-off-by: tensorworker <tensorworker@proton.me>
@tensorworkerr tensorworkerr force-pushed the fix-env-file-tilde-expansion branch from 3f2191b to 3097793 Compare January 15, 2026 00:02
…on.me>

Signed-off-by: tensorworker <tensorworker@proton.me>
@tensorworkerr tensorworkerr force-pushed the fix-env-file-tilde-expansion branch from 3097793 to 9551e86 Compare January 15, 2026 00:03
@ndeloof ndeloof enabled auto-merge (rebase) January 15, 2026 07:14
@ndeloof ndeloof merged commit 02b606e into docker:main Jan 15, 2026
24 checks passed
@thaJeztah
Copy link
Member

@ndeloof I don't think this was a bug, and actually the correct behavior; expansion is handled by the shell, and does not happen if the value is prefixed by a =; you'll see the same for any tool, e.g. trying with git;

git --git-dir=~/go/src/github.com/docker/compose/.git describe
fatal: not a git repository: '~/go/src/github.com/docker/compose/.git'

git --git-dir ~/go/src/github.com/docker/compose/.git describe
v2.26.1-891-gb760afaf9

Bit concerned that this could be a sliding slope.

@ndeloof
Copy link
Contributor

ndeloof commented Jan 15, 2026

@thaJeztah yes I know shell is in charge for this, but as long as we support both space and equal flag values, need to get an homogeneous behavior. compose.yaml already offers this feature

@thaJeztah
Copy link
Member

Yeah, the issue here would be that it's not homogeneous across the CLI; other commands will not expand these, so now docker <some command> --some-flag=~/foo won't work, but docker compose --some-flag=~/foo will.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] docker compose down --env does not translate ~/.env to .env file in home directory

3 participants