当使用 linux 的 windows 子系统安装在 docker 中时,'~' 扩展到哪里?

Where does '~' expand to when mounted in docker with windows subsystem for linux?

我有一个我编写的 docker 容器,用于为我设置 AWS 配置文件。在 Linux 中它很好用,在 WSL 上它部分起作用。

当我 运行 容器时,我正在安装 ~/.aws 目录,检查配置文件是否存在,如果不存在,我将创建它们。如果它们确实存在,我什么都不做。

在 Linux 我可以 运行 这个容器,然后继续使用 aws-cli 没有问题。
在 Linux 的 Windows 子系统中 - 当我第一次 运行 容器时,它会为我创建配置文件。如果我再次选择 运行 容器,它会发现配置文件已经存在,所以它什么都不做。这告诉我文件存在 某处 但我不能使用 aws-cli 因为文件不存在于 ~/.aws.

所以我的问题是,当安装到 docker 容器时,WSL 中的 ~/.aws 在哪里?我试图在 WSL 中对整个文件系统进行查找,但 returns 什么也没有。我也试过将安装路径更改为 /root/.aws 并且我 运行 进入相同的条件。

编辑:

我仍然不知道上述问题的答案。但是,如果有人遇到这个问题,我确实找到了解决方法。

我更新了 Docker 桌面以允许安装整个 c:/ 驱动器。然后我只是将 docker 运行 命令更改为挂载 c:/.aws 而不是 ~/.aws,所以我的命令看起来像 -v c:/.aws:/root/.aws。之后,我在 WSL export AWS_SHARED_CREDENTIALS_FILE="/mnt/c/.aws/credentials" 中添加了这个环境变量,现在 aws cli 开始接收我的配置文件更改。

shell 总是将 ~ 扩展为 HOME 环境变量的值。如果未设置该环境变量,则它会扩展为空。如果你想找到 ~/.aws 所在的位置,那么你可以写类似 echo ~/.aws 的东西,shell 会为你扩展它。

唯一的例外是 ~user 扩展到用户 user 的主目录;那里没有咨询 HOME 环境变量。

您必须记住,在您的设置中,docker 引擎(docker for windows)安装在 windows 上,它位于 windows docker 命令是 'launched' 的环境。因此,当您说使用 ~/.aws 时,它会在 windows 文件系统中查找此位置。

在 windows 中 ~ 是一个有效的目录名称(在 cmd 提示符下尝试 mkdir ~)所以当你说 map ~/.aws 我不确定实际创建了什么。也许尝试在您的 C 驱动器中搜索一个名为 ~ 的文件夹。 windows 中没有 ~ 用于主文件夹的快捷方式,如果有它会是哪个主文件夹?已登录 windows 用户的家?还是WSL里面的家?

要在 WSL 中进行这项工作,您需要像这样将 ~/.aws 传递给 wslpath:

➜  echo $(wslpath ~/.aws)
/mnt/c/home/damo/.aws

但是这个位置是根据 WSL 的路径而不是 windows 你需要第二次用 -w 标志做两次

➜  echo $(wslpath -w $(wslpath ~/.aws))
C:\home\damo\.aws

这将使您的最终 docker 命令看起来像这样:

docker run -it -v  $(wslpath -w $(wslpath ~/.aws)):/root/.aws awsprofileprocessor:latest

有了这个,您现在将告诉 docker windows windows 安装

的路径

如果这对你有用,请告诉我,我很想知道结果如何。