【问题标题】:Where does '~' expand to when mounted in docker with windows subsystem for linux?当安装在 docker 和 windows 子系统 for linux 中时,'~' 扩展到哪里?
【发布时间】:2020-05-21 22:47:17
【问题描述】:

我有一个我编写的 docker 容器,它为我设置了 AWS 配置文件。在 Linux 上它运行良好,在 WSL 上它部分运行。

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

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

所以我的问题是 WSL 中的 ~/.aws 在安装到 docker 容器时在哪里?我试图在 WSL 中的整个文件系统上进行查找,但没有返回任何内容。我也尝试将挂载路径更改为/root/.aws,但我遇到了同样的情况。

编辑:

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

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

【问题讨论】:

  • 在我尝试回答这个问题之前,您能否说明您使用的是哪个版本的 WSL,1 还是 2?以及您使用的是什么版本的 docker,我假设您使用 docker for windows 作为引擎?最后你在 WSL 中安装了 docker CLI 吗?
  • @Damo 我正在使用 WSL1、Docker Desktop 2.3.0.2(引擎版本 19.03.8)。是的,它是 Windows 的 docker 作为引擎,我确实在 WSL 中安装了 docker cli。
  • 您能否发布您正在运行的挂载 ~/.aws 目录的 docker run 命令
  • @Damo docker run -it -v ~/.aws:/root/.aws awsprofileprocessor:latest

标签: linux windows amazon-web-services docker windows-subsystem-for-linux


【解决方案1】:

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

唯一的例外是~user扩展为用户user的主目录; HOME 环境变量未在此处查询。

【讨论】:

  • 这里不是这样。我认为由于 WSL docker 正在使用 docker desktop for windows,因此它位于我的 C 驱动器上。即使我将/root/.aws 硬编码为挂载点,它实际上仍然不会显示在/root/.aws。
【解决方案2】:

您必须记住,在您的设置中,docker 引擎(适用于 windows 的 docker)安装在 windows 上,docker 命令是在 windows 环境中“启动”的。因此,当您说使用 ~/.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 for windows 放置挂载的 windows 路径

如果这对你有用,请告诉我,我对结果很感兴趣。

【讨论】:

  • 就是这样,我在windows端找到了一个名为~的目录。我最终没有使用wslpath,而是将其硬编码为c:/.aws,然后使用WSL 中的AWS_SHARED_CREDENTIALS_FILE 环境变量指向该路径。非常感谢!!!!
猜你喜欢
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多