Docker 工具技巧与窍门
本文涵盖了Visual Studio Code Docker 扩展的故障排除技巧和窍门。有关设置和使用Docker的详细信息,请参阅概述和快速入门文章,包括Node.js、Python或ASP.NET。
以非root用户身份运行
出于安全考虑,我们建议在执行添加Dockerfiles到工作区命令时选择默认端口,或者尽可能选择大于1023的端口。这将允许VS Code配置具有非root访问权限的Dockerfile,并防止恶意用户在容器中提升权限。在某些情况下,没有端口选择,因此Docker扩展默认配置非root访问权限。在所有情况下,您必须确保应用程序修改或使用的每个资源(如端口和文件)都可以由容器中的非root用户访问。
如果您在向工作区添加Dockerfiles时选择小于1024的端口,Docker扩展无法创建以非root用户身份运行容器的Dockerfile。这是因为此范围内的端口被称为知名或系统端口,必须具有root权限才能将网络套接字绑定到IP地址。
将Dockerfiles添加到工作区命令会在您选择非系统端口时设置非root权限。如果您的当前Dockerfile和tasks.json
未设置为非root使用,请尝试运行将Dockerfiles添加到工作区命令,并选择一个大于1023的端口。此命令将覆盖您当前的Dockerfile和tasks.json
。对于某些项目类型,例如Python: General,您可能仍需要修改您的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的安装后步骤中的“以非root用户身份管理Docker”步骤来从扩展访问Docker。
Docker 容器和镜像已从 Docker 视图中消失
这很可能是由另一个名为Docker Explorer
(非微软开发)的扩展引起的冲突。要解决此问题,请使用vscode-docker issue #1609中描述的解决方法。
扩展程序在远程机器上找不到Docker
错误信息 "连接失败。Docker 是否已安装并正在运行?"
- 确保远程机器上已安装Docker引擎,并且Docker CLI可以正常工作(从终端运行
docker ps
并确保它没有返回任何错误)。 - 如果您使用的是远程开发环境(通过SSH连接的远程机器、WSL子系统、GitHub Codespace),请确保Docker扩展在远程和本地都已安装。
无效的URL错误
如果您需要连接到远程Docker守护进程,我们建议使用Docker上下文,而不是设置中的docker.environment
属性。查看本指南以了解如何创建和使用上下文与远程Docker守护进程通信。
如果您仍然需要覆盖当前使用的Docker上下文,请确保您的DOCKER_HOST
环境变量或docker.environment.DOCKER_HOST
属性在URL中包含协议(例如,ssh://myuser@mymachine
或tcp://1.2.3.4
)。
注意: 请记住,您的
docker.environment.DOCKER_HOST
属性将覆盖您的 Docker 上下文,而DOCKER_HOST
环境变量将覆盖docker.environment.DOCKER_HOST
属性和您的 Docker 上下文。
提示: 在 Powershell 中,您可以使用
$ENV:DOCKER_HOST = 'ssh://username@1.2.3.4'
更改您的 Docker 环境变量。
问题和反馈
我们非常欢迎您的反馈!如果您有任何想法或建议,请报告一个问题。