VS 代码远程开发:容器 postCreateCommand 没有 运行

VS Code Remote Development: Container postCreateCommand doesn't run

我正在尝试为远程开发工作区配置 SSH 身份验证,详见 documentation:

{
  "dockerfile": "Dockerfile",
  "runArgs": [
    // ...
    "-v",
    "${env:HOME}${env:USERPROFILE}/.ssh:/root/.ssh-localhost:ro"
  ],
  "postCreateCommand": "echo \"copying ssh keys...\" && mkdir -p ~/.ssh && cp -r ~/.ssh-localhost/* ~/.ssh && chmod 700 ~/.ssh && chmod 600 ~/.ssh/*",
  extensions: [
    // ...
  ]
}

请注意,我在该行的开头添加了一个 echo 语句,只是为了确保我知道它是否 运行s。除此之外,它与文档相同。

但是,postCreateCommand 似乎永远不会是 运行。如果我查看 Dev Containers 终端输出,我既没有看到预期的 docker exec 命令,也没有看到 echo 语句的 copying ssh keys... 输出,并且容器内部的 ls -a /root 显示 .ssh-localhost 文件夹,但不是 .ssh.

我在日志中也没有看到任何错误消息。我已经尝试触发 "Remote Development: Rebuild Container" 以及在重新加载 window 之前删除容器和图像,但无论如何都会得到相同的结果。

我这里缺少什么配置?

已经有一段时间了,所以我不能 100% 确定这是我的问题,但与此同时我正在努力进行此配置 运行ning,我也尝试了通过在 ~/.vscode-server.

安装命名卷来优化启动时间

结果证明这是针对此特定用例的 "bad" 想法,因为 postCreateCommand 是否应该 运行 取决于内部是否存在标记文件该目录(以及文件树下的一两层)。因此,当我重新构建容器并重新启动 VS Code window 时,卷被重新挂载到新容器并且标记文件已经存在,因此命令不是 运行。

我发现,解决此问题的更好方法是将以下内容添加到您的 Dockerfile 而不是 postCreateCommand:

RUN echo "\n\nif [ -d ~/.bashrc.d ]; then\n  for rc in ~/.bashrc.d/*rc; do\n    . $rc\n  done\nfi\n" >> $HOME/.bashrc

其中 $HOME/root/home/$USER 取决于您是否 运行 将容器设置为 root。

然后,这允许您将目录卷挂载到 ~/.bashrc.d 位置,并且该目录中每个匹配 *rc 的文件都将 运行 作为配置文件脚本的一部分.上面的 SSH 设置脚本可以放在 sshrc 文件中,而不是用 if [[ -d ~/.ssh ]] 包围以避免每次都 运行 连接它。