容器工具提示和技巧
本文介绍了 Visual Studio Code 容器工具扩展程序的故障排除技巧。有关设置和使用容器的详细信息,请参阅 概述以及 Node.js、Python 或 ASP.NET 的快速入门文章。
以非 root 用户身份运行
出于安全原因,我们建议在执行 Containers: Add Docker Files to Workspace... (容器:将 Docker 文件添加到工作区...) 命令时选择默认端口,或者尽可能选择一个大于 1023 的端口。这样,VS Code 就可以配置 Dockerfile 以实现非 root 访问,并防止恶意用户在容器中提升权限。在某些情况下,没有端口选择,因此容器工具扩展程序会默认配置非 root 访问。在所有情况下,您都必须确保应用程序修改或使用的每个资源(如端口和文件)都可以被容器中的非 root 用户访问。
如果您在将 Docker 文件添加到工作区时选择小于 1024 的端口,容器工具扩展程序将 **无法** 创建以非 root 用户身份运行容器的 Dockerfile。这是因为此范围内的端口称为 **知名** 或 **系统** 端口,必须使用 root 权限来执行才能将网络套接字绑定到 IP 地址。
Containers: Add Docker Files to Workspace... (容器:将 Docker 文件添加到工作区...) 命令会在您选择非系统端口时设置非 root 权限。如果当前的 Dockerfile 和 tasks.json 未设置为非 root 使用,请尝试运行 Containers: Add Docker Files to Workspace... (容器:将 Docker 文件添加到工作区...) 命令,并选择一个大于 1023 的端口。此命令将覆盖您当前的 Dockerfile 和 tasks.json。对于某些项目类型,例如 Python: General (Python:通用),您可能仍需要修改 Dockerfile 和 tasks.json。在 Dockerfile 中,您必须公开一个 **非系统端口**,为您的应用代码创建工作目录,然后添加一个有权访问应用目录的非 root 用户。确保在引用它的任何地方都更新了公开的端口。在下面的示例中,Gunicorn 端口必须更新才能匹配公开的端口
# 1024 or higher
EXPOSE 1024
# ... other directives such as installing requirements.txt file
# Creates /app in container if it does not already exist
# Ports code into /app
WORKDIR /app
ADD . /app
# Creates a non-root user and adds permission to access the /app folder
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser
CMD ["gunicorn", "--bind", "0.0.0.0:1024", "pythonPath.to.wsgi"]
接下来,确保 tasks.json 中的 docker run 任务也期望相同的端口。您通常可以在 tasks.json 中搜索旧端口号的所有出现并将其替换为新端口号。下面的示例显示了 Python Django 应用所需的更改
{
"type": "docker-run",
"label": "docker-run: debug",
"dependsOn": ["docker-build"],
"python": {
"args": [
"runserver",
"0.0.0.0:1024", //<- Change the number after the colon
"--nothreading",
"--noreload"
],
"file": "manage.py"
}
}
Linux 上出现错误“connect EACCES /var/run/docker.sock”
由于 VS Code 以非 root 用户身份运行,您需要按照 Linux 安装后步骤 中“将 Docker 作为非 root 用户进行管理”的步骤来从扩展程序访问 Docker。
容器和镜像从容器资源管理器中消失
这很可能是由于与另一个名为 Docker Explorer (非 Microsoft 编写) 的扩展程序发生冲突。要解决此问题,请使用 vscode-docker issue #1609 中描述的解决方法。
扩展程序在远程计算机上找不到 Docker
错误消息“连接失败。Docker 是否已安装并正在运行?”
- 请确保远程计算机上**已安装** Docker 引擎,并且 Docker CLI 可以正常工作(在终端中运行
docker ps并确保没有返回任何错误)。 - 如果您正在使用远程开发环境(通过 SSH 的远程计算机、WSL 子系统、GitHub Codespace),请确保容器工具扩展程序在远程和本地都已安装。
无效的 URL 错误
如果您需要连接到远程 Docker 守护程序,我们建议使用 Docker 上下文而不是在设置中使用 containers.environment 属性。请参阅此指南,了解如何 创建和使用上下文 来与远程 Docker 守护程序通信。
如果您仍需要覆盖当前使用的 Docker 上下文,请确保您的 DOCKER_HOST 环境变量或 containers.environment.DOCKER_HOST 属性在 URL 中包含协议(例如,ssh://myuser@mymachine 或 tcp://1.2.3.4)。
注意:请记住,您的
containers.environment.DOCKER_HOST属性将覆盖您的 Docker 上下文,而DOCKER_HOST环境变量将覆盖containers.environment.DOCKER_HOST属性和您的 Docker 上下文。
提示:在 Powershell 中,您可以使用
$ENV:DOCKER_HOST = 'ssh://username@1.2.3.4'更改 Docker 环境变量
问题和反馈
我们非常重视您的反馈!如果您有任何想法或建议,请 报告一个 issue。