首页 > 解决方案 > VS Code 远程开发:容器 postCreateCommand 不运行

问题描述

我正在尝试为远程开发工作区配置 SSH 身份验证,如文档中所述:

{
  "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在该行的开头添加了一条语句,只是为了确保我知道它是否运行。除此之外,它与文档相同。

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

我在日志中也没有看到错误消息。我已经尝试触发“远程开发:重建容器”以及在重新加载窗口之前删除容器和图像,但无论如何都会得到相同的结果。

我在这里缺少什么配置?

标签: visual-studio-codevscode-remote

解决方案


已经有一段时间了,所以我不能 100% 确定这是我的问题,但同时我正在努力让这个配置启动并运行,我还尝试通过在~/.vscode-server.

对于这个特定的用例,这被证明是一个“坏”的想法,因为是否postCreateCommand应该运行取决于该目录中是否存在标记文件(以及文件树的一两层)。因此,当我重新构建容器并重新启动 VS Code 窗口时,卷被重新挂载到新容器并且标记文件已经存在,因此该命令没有运行。

我发现,解决这个问题的更好方法是将以下内容添加到您的 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

where$HOME或者取决于您是否以 root 身份运行容器/root/home/$USER

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


推荐阅读