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 ]]
包围以避免每次都 运行 连接它。
我正在尝试为远程开发工作区配置 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 ]]
包围以避免每次都 运行 连接它。