尝试以扩展 VS Code 中的代理模式!

自定义容器工具扩展

容器工具扩展包括多个 Visual Studio Code 任务,用于控制 Docker buildrun 的行为,并构成调试时容器启动的基础。

这些任务允许进行大量的控制和自定义。最终配置是通用默认值、特定于平台的默认值(例如 Node.js、Python 或 .NET)和用户输入的组合。当用户输入与默认值冲突时,用户输入优先。

容器工具扩展任务支持 Visual Studio Code 任务的所有通用功能(例如,将任务分组为复合任务)。有关通用任务功能和属性的更多信息,请参阅 Visual Studio Code 自定义任务文档。

Docker build 任务

docker-build 任务使用 Docker 命令行 (CLI) 构建镜像。该任务可以单独使用,也可以作为一系列任务的一部分在容器内运行和/或调试应用程序。

docker-build 任务最重要的配置设置是 dockerBuildplatform

  • dockerBuild 对象指定 Docker build 命令的参数。此对象指定的值将直接应用于 Docker build CLI 调用。
  • platform 属性是一个提示,它会更改 docker-build 任务确定 Docker build 默认值的方式。

有关所有任务属性的完整列表,请参阅属性参考

平台支持

虽然 tasks.json 中的 docker-build 任务可用于构建任何镜像,但该扩展对 Node.js、Python 和 .NET Core 有明确的支持(和简化的配置)。

Node.js (docker-build)

使用默认值的最小配置

对于没有特定平台选项的基于 Node.js 的镜像,只需将 platform 属性设置为 node

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Build Node Image",
      "type": "docker-build",
      "platform": "node"
    }
  ]
}

平台默认值

对于基于 Node.js 的镜像,docker-build 任务会推断以下选项

属性 推断值
dockerBuild.context package.json 所在的同一目录。
dockerBuild.dockerfile package.json 所在目录中的 Dockerfile 文件。
dockerBuild.tag package.json 中的应用程序 name 属性(如果已定义),否则为 package.json 所在文件夹的基名称。
dockerBuild.pull 默认为 true,以便在构建前拉取新的基础镜像。

Python (docker-build)

使用默认值的最小配置

对于没有特定平台选项的基于 Python 的镜像,只需将 platform 属性设置为 python

{
  "tasks": [
    {
      "type": "docker-build",
      "label": "docker-build",
      "platform": "python"
    }
  ]
}

平台默认值

对于基于 Python 的镜像,docker-build 任务会推断以下选项

属性 推断值
dockerBuild.context 默认上下文是工作区文件夹。
dockerBuild.dockerfile 默认的 Dockerfile 路径将在工作区文件夹的根目录中。
dockerBuild.tag 根工作区文件夹的基名称。
dockerBuild.pull 默认为 true,以便在构建前拉取新的基础镜像。

.NET (docker-build)

使用默认值的最小配置

当您构建基于 .NET 的镜像时,可以省略 platform 属性,只需设置 netCore 对象即可(当 netCore 对象存在时,platform 会隐式设置为 netcore)。请注意,appProject 是必需的属性

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Build Node Image",
      "type": "docker-build",
      "netCore": {
        "appProject": "${workspaceFolder}/project.csproj"
      }
    }
  ]
}

平台默认值

对于基于 .NET 的镜像,docker-build 任务会推断以下选项

属性 推断值
dockerBuild.context 根工作区文件夹。
dockerBuild.dockerfile 根工作区文件夹中的 Dockerfile 文件。
dockerBuild.tag 根工作区文件夹的基名称。
dockerBuild.pull 默认为 true,以便在构建前拉取新的基础镜像。

构建任务参考

以下是可用于配置 docker-build 任务的所有属性。除非另有说明,否则所有属性都是可选的。

属性 描述
dockerBuild 用于控制执行的 docker build 命令的选项(见下文)。
除非设置了 platform,否则为必需。
platform 确定平台:.NET (netcore) 或 Node.js (node) 以及 docker build 命令的默认设置。
node 确定特定于 Node.js 项目的选项(见下文)。
python docker-build 任务中,Python 没有对象属性。
netCore 确定特定于 .NET 项目的选项(见下文)。

dockerBuild 对象属性

属性 描述 等效的 docker build CLI
context 构建上下文的路径。
必需,除非从平台推断。
PATH
dockerfile Dockerfile 的路径。
必需,除非从平台推断。
-f--file
tag 应用于镜像的标签。
必需,除非从平台推断。
-t--tag
buildArgs 应用于命令行的构建参数。这是一个键值对列表。 --build-arg
labels 添加到镜像的标签。这是一个键值对列表(一个 JSON 对象)。
除了此处指定的标签外,还会向镜像添加一个标签 com.microsoft.created-by,其值设置为 visual-studio-code。可以通过将 labels 对象的 includeDefaults 属性设置为 false 来关闭此行为。
--label
target 要构建的 Dockerfile 中的目标。 --target
pull 是否在构建前拉取新的基础镜像。 --pull
customOptions 在 context 参数之前添加的任何额外参数。不会尝试解决与其他选项的冲突或验证此选项。 (任意)

node 对象属性(docker-build 任务)

属性 描述 默认值
package 与 Dockerfile 和 docker-build 任务关联的 package.json 文件的路径。 根工作区文件夹中的 package.json 文件。

netCore 对象属性(docker-build 任务)

属性 描述
appProject 与 Dockerfile 和 docker-build 任务关联的 .NET 项目文件(.csproj.fsproj 等)。
始终必需。

Docker run 任务

tasks.json 中的 docker-run 任务使用 Docker 命令行 (CLI) 创建并启动容器。该任务可以单独使用,也可以作为一系列任务的一部分在容器内调试应用程序。

docker-run 任务最重要的配置设置是 dockerRunplatform

  • dockerRun 对象指定 Docker run 命令的参数。此对象指定的值将直接应用于 Docker run CLI 调用。
  • platform 属性是一个提示,它会更改 docker-run 任务确定 Docker run 默认值的方式。

有关所有任务属性的完整列表,请参阅属性参考

Docker run 平台支持

虽然 docker-run 任务可用于运行任何 Docker 镜像,但该扩展对 Node.js、Python 和 .NET 有明确的支持(和简化的配置)。

Node.js (docker-run)

使用默认值的最小配置

对于没有特定平台选项的基于 Node.js 的镜像,只需将 platform 属性设置为 node

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Run Node Image",
      "node": "docker-run",
      "platform": "node"
    }
  ]
}

平台默认值

对于基于 Node.js 的镜像,docker-run 任务会推断以下选项

属性 推断值
dockerRun.command package.json 中的 npm start 脚本生成(如果存在),否则从 package.json 中的 main 属性生成。
dockerRun.containerName 从应用程序包名称派生。
dockerRun.image 来自依赖的 docker-build 任务的标签(如果存在),或从应用程序包名称派生,该名称本身从 package.json 中的 name 属性或其所在文件夹的基名称派生。

Python (docker-run)

构建基于 Python 的镜像时,可以省略 platform 属性,只需设置 python 对象即可(当 python 对象存在时,platform 会隐式设置为 python

Django 应用的最小配置

{
  "type": "docker-run",
  "label": "docker-run: debug",
  "dependsOn": ["docker-build"],
  "python": {
    "args": ["runserver", "0.0.0.0:8000", "--nothreading", "--noreload"],
    "file": "path_to/manage.py"
  }
}

Flask 应用的最小配置

{
  "type": "docker-run",
  "label": "docker-run: debug",
  "dependsOn": ["docker-build"],
  "dockerRun": {
    "env": {
      "FLASK_APP": "path_to/flask_entry_point.py"
    }
  },
  "python": {
    "args": ["run", "--no-debugger", "--no-reload", "--host", "0.0.0.0", "--port", "5000"],
    "module": "flask"
  }
}

通用应用的最小配置

{
  "type": "docker-run",
  "label": "docker-run: debug",
  "dependsOn": ["docker-build"],
  "python": {
    "file": "path_to/app_entry_point.py"
  }
}

平台默认值

对于基于 Python 的镜像,docker-run 任务会推断以下选项

属性 推断值
dockerRun.command 由 Python 对象生成,并由 Python 调试器调用。
dockerRun.containerName 从根工作区文件夹的基名称派生。
dockerRun.image 来自依赖的 docker-build 任务的标签(如果存在),或从根工作区文件夹的基名称派生。

.NET (docker-run)

使用默认值的最小配置

构建基于 .NET 的镜像时,可以省略 platform 属性,只需设置 netCore 对象即可(当 netCore 对象存在时,platform 会隐式设置为 netcore)。请注意,appProject 是必需的属性

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Run .NET Core Image",
      "type": "docker-run",
      "netCore": {
        "appProject": "${workspaceFolder}/project.csproj"
      }
    }
  ]
}

平台默认值

对于基于 .NET 的镜像,docker-run 任务会推断以下选项

属性 推断值
dockerRun.containerName 从根工作区文件夹的基名称派生。
dockerRun.env 根据需要添加以下环境变量:ASPNETCORE_ENVIRONMENTASPNETCORE_URLSDOTNET_USE_POLLING_FILE_WATCHER
dockerRun.image 来自依赖的 docker-build 任务的标签(如果存在),或从根工作区文件夹的基名称派生。
dockerRun.os Linux
dockerRun.volumes 根据需要添加以下卷:本地应用程序文件夹、源文件夹、调试器文件夹、NuGet 包文件夹和 NuGet 后备文件夹。

运行任务参考

以下是可用于配置 docker-run 任务的所有属性。除非另有说明,否则所有属性都是可选的。

属性 描述
dockerRun 用于控制执行的 docker run 命令的选项(见下文)。
除非设置了 platform,否则为必需。
platform 确定平台:.NET (netcore) 或 Node.js (node) 以及 docker run 命令的默认设置。
node 对于 Node.js 项目,这会控制各种选项(见下文)。
python 对于 Python 项目,这会控制各种选项(见下文)。
netCore 对于 .NET 项目,这会控制各种选项(见下文)。

dockerRun 对象属性

属性 描述 等效 CLI
image 要运行的镜像的名称(标签)。
必需,除非从平台推断。
IMAGE
command 启动容器时要运行的命令。
必需,除非从平台推断。
COMMAND [ARG...]
containerName 赋予已启动容器的名称。
必需,除非从平台推断。
--name
env 在容器中设置的环境变量。这是一个键值对列表。 -e--env
envFiles 这是一个 .env 文件列表。 --env-file
labels 赋予已启动容器的标签。这是一个键值对列表。 --label
network 容器将连接到的网络的名称。 --network
networkAlias 已启动容器的网络范围别名。 --network-alias
os 默认为 Linux,另一个选项是 Windows。使用的容器操作系统。 不适用
ports 要从容器发布(映射)到主机的端口。这是一个对象列表(见下文)。 -p--publish
portsPublishAll 是否发布 Docker 镜像公开的所有端口。如果未明确发布任何端口,则默认为 true -P
extraHosts 要添加到容器中用于 DNS 解析的主机。这是一个对象列表(见下文)。 --add-host
volumes 要映射到已启动容器中的卷。这是一个对象列表(见下文)。 -v--volume
remove 是否在容器停止后将其删除。 --rm
customOptions 在 image 参数之前添加的任何额外参数。不会尝试解决与其他选项的冲突或验证此选项。 (任意)

ports 对象属性

属性 描述 默认值
containerPort 在容器上绑定的端口号。
必需。
hostPort 在主机上绑定的端口号。 (由 Docker 随机选择)
protocol 绑定的协议(tcpudp)。 tcp

extraHosts 对象属性

属性 描述
hostname 用于 DNS 解析的主机名。
必需。
ip 与上述主机名关联的 IP 地址。
必需。

volumes 对象属性

属性 描述 默认值
localPath 将被映射的本地计算机上的路径。
必需。
containerPath 本地路径将映射到的容器中的路径。
必需。
permissions 容器在映射路径上拥有的权限。可以是 ro(只读)或 rw(读写)。 依赖于容器。

node 对象属性(docker-run 任务)

属性 描述 默认值
package docker-run 任务关联的 package.json 文件的路径。 根工作区文件夹中的 package.json 文件。
enableDebugging 是否在容器内启用调试。 false
inspectMode 定义应用程序和调试器之间的初始交互(defaultbreak)。
default 允许应用程序运行,直到调试器附加。
break 阻止应用程序运行,直到调试器附加。
default
inspectPort 应进行调试的端口。 9229

python 对象属性(docker-run 任务)

属性 描述 默认值
args 传递给 Python 应用的参数。 依赖于平台。上面显示了基架的默认值
debugPort 调试器将侦听的端口。 5678
wait 是否等待调试器附加。 true
module 要运行的 Python 模块(只能选择模块文件)。
file 要运行的 Python 文件(只能选择模块文件)。

netCore 对象属性(docker-run 任务)

属性 描述
appProject docker-run 任务关联的 .NET 项目文件(.csproj.fsproj 等)。
必需。
configureSsl 是否配置 ASP.NET Core SSL 证书和其他设置以在容器中的服务上启用 SSL。
enableDebugging 是否为调试启用已启动的容器。这将推断出调试所需的其他卷映射和其他选项。

Docker Compose 任务

tasks.json 中的 docker-compose 任务使用 Docker Compose 命令行 (CLI) 创建并启动容器。该任务可以单独使用,也可以作为一系列任务的一部分在容器内调试应用程序。

docker-compose 任务最重要的配置设置是 dockerCompose

  • dockerCompose 对象指定 Docker Compose 命令的参数。此对象指定的值将直接应用于 Docker Compose CLI 调用。

有关所有任务属性的完整列表,请参阅属性参考

示例配置

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Run docker-compose up",
      "type": "docker-compose",
      "dockerCompose": {
        "up": {
          "detached": true,
          "build": true,
          "services": ["myservice"]
        },
        "files": [
          "${workspaceFolder}/docker-compose.yml",
          "${workspaceFolder}/docker-compose.debug.yml"
        ]
      }
    }
  ]
}

Compose 任务参考

以下是可用于配置 docker-compose 任务的所有属性。除非另有说明,否则所有属性都是可选的。

属性 描述
dockerCompose 用于控制执行的 docker-compose 命令的选项(见下文)。
必需。

dockerCompose 对象属性

属性 描述 等效 CLI
up 运行 docker-compose up 命令。
必须指定此项或 down,但不能同时指定两者。
docker-compose up
down 运行 docker-compose down 命令。
必须指定此项或 up,但不能同时指定两者。
docker-compose down
files 要在 docker-compose 命令中使用的 Docker Compose YAML 文件列表。如果未指定,Docker Compose CLI 将查找 docker-compose.ymldocker-compose.override.yml -f <文件>
envFile 读入并应用于容器的环境变量文件。 --env-file <文件>
projectName 在命名和标记 Docker 对象时使用的备用项目名称。如果在 compose up 时使用备用项目名称,则在 compose down 时必须指定相同的项目名称。 --project-name <名称>

up 对象属性

属性 描述 等效 CLI 默认值
detached 是否分离运行。 -d true
build 是否在运行前构建。 --build true
scale 要运行的每个服务的实例数。这是一个键值对列表。 --scale SERVICE=NUM
services 要启动的服务子集。不能与 profiles 结合使用。 [SERVICE...] (全部)
profiles 要启动的配置文件子集。不能与 services 结合使用。 --profile <配置文件> (全部)
customOptions up 参数后添加的任何额外参数。不会尝试解决与其他选项的冲突或验证此选项。 (任意)

down 对象属性

属性 描述 等效 CLI 默认值
removeImages 是否删除镜像,以及删除哪些镜像。all 将删除任何服务使用的所有镜像,local 将仅删除没有自定义标签的镜像。不设置此项将不删除任何镜像。 --rmi
removeVolumes 是否删除命名卷。 -v false
customOptions down 参数后添加的任何额外参数。不会尝试解决与其他选项的冲突或验证此选项。 (任意)

命令自定义

当您执行各种操作时(例如构建镜像、运行容器、附加到容器和查看容器日志),容器工具扩展会执行许多 Docker CLI 命令。其中一些命令有大量的可选参数,通常用于非常特定的场景。作为上述 Visual Studio Code 任务的替代方案,当不使用任务时,可以自定义多个命令。

例如,Compose Up 命令中的令牌 ${serviceList}${profileList} 允许轻松启动 Docker Compose YAML 文件中的服务子集。

对于每个可自定义的 Docker 命令,都有一个配置设置可用于设置要执行的模板。或者,您可以定义多个模板,并可选择使用正则表达式,当匹配时,它会提示应使用模板的上下文。模板支持一些类似于 launch.jsontasks.json 的令牌,例如 ${workspaceFolder}

设置 JSON 架构

您有两个选项来配置每个模板(如下所列)。第一个选项是一个覆盖默认行为的单个模板

{
  "containers.commands.build": "docker build --rm -f \"${dockerfile}\" -t ${tag} \"${context}\""
}

第二个选项是多个模板,将根据 match 正则表达式以及用户输入来选择。

例如,以下示例中显示了三个模板

{
  "containers.commands.build": [
    {
      "label": "Default build command",
      "template": "docker build --rm -f \"${dockerfile}\" -t ${tag} \"${context}\""
    },
    {
      "label": "Alpine-specific build command",
      "template": "docker build -p 1234:1234 -f \"${dockerfile}\" -t ${tag} \"${context}\"",
      "match": "alpine"
    }
  ]
}

选择行为

选择要执行的命令模板的规则如下

  1. 如果未配置任何设置,则选择默认命令模板。
  2. 如果只配置了一个模板(上面的第一个示例),则选择该模板。
  3. 如果配置了多个模板
    1. 将检查受约束的模板。受约束的模板具有 matchmatch 正则表达式与上下文提示进行比较——例如,镜像名称、容器名称等。
    2. 如果应用了多个受约束的模板,系统将提示用户选择。如果只应用了一个,则不会提示用户。
    3. 如果没有适用的受约束模板,则检查不受约束的模板。不受约束的模板没有 match,因此始终适用。
    4. 如果应用了多个不受约束的模板,系统将提示用户选择。如果只应用了一个,则不会提示用户。

Docker Build

配置设置 默认值
docker.commands.build ${containerCommand} build --rm -f "${dockerfile}" -t ${tag} "${context}"

支持的令牌

标记 描述
${containerCommand} 用于执行容器命令的 CLI 命令/可执行文件。
${dockerfile} 所选 Dockerfile 的工作区相对路径。
${tag} 调用 build 命令时用户输入/确认的值。如果之前已构建,则默认为该 Dockerfile 之前输入的值。
${context} 如果已设置,则为 containers.imageBuildContextPath 配置设置的值。否则,为 Dockerfile 所在的相对于工作区的文件夹。

注意:如果 containers.commands.build 设置不包含 ${tag} 令牌,则不会提示用户输入/确认标签。

注意match 正则表达式将与所选的 Dockerfile 名称和工作区文件夹名称进行比较。

Docker Run

配置设置 默认值
containers.commands.run ${containerCommand} run --rm -d ${exposedPorts} ${tag}
containers.commands.runInteractive ${containerCommand} run --rm -it ${exposedPorts} ${tag}

支持的令牌

标记 描述
${containerCommand} 用于执行容器命令的 CLI 命令/可执行文件。
${exposedPorts} 从镜像中公开的端口列表(最终来自 Dockerfile)生成,其中每个公开的端口都映射到本地计算机上的同一端口。例如,"EXPOSE 5000 5001" 将生成 "-p 5000:5000 -p 5001:5001"
${tag} 所选镜像的完整标签。

注意match 正则表达式将与所选镜像的完整标签进行比较。

容器附加

配置设置 默认值
containers.commands.attach ${containerCommand} exec -it ${containerId} ${shellCommand}

支持的令牌

标记 描述
${containerCommand} 用于执行容器命令的 CLI 命令/可执行文件。
${containerId} 要附加到的容器的 ID。
${shellCommand} 如果容器中存在 bash,则在此处替换,否则为 sh。在 Windows 容器中,始终使用 cmd

注意match 正则表达式将与容器名称和容器镜像的完整标签进行比较。

容器日志

配置设置 默认值
containers.commands.logs ${containerCommand} logs -f ${containerId}

支持的令牌

标记 描述
${containerCommand} 用于执行容器命令的 CLI 命令/可执行文件。
${containerId} 要查看日志的容器的 ID。

注意match 正则表达式将与容器名称和容器镜像的完整标签进行比较。

Docker Compose Up

配置设置 默认值
containers.commands.composeUp ${composeCommand} ${configurationFile} up ${detached} ${build}

支持的令牌

标记 描述
${configurationFile} 设置为 -f 加上所选 Docker Compose YAML 文件的相对于工作区的路径。
${detached} 如果配置设置 containers.composeDetached 设置为 true,则设置为 -d。否则,设置为 ""
${build} 如果配置设置 containers.composeBuild 设置为 true,则设置为 --build。否则,设置为 ""
${serviceList} 如果指定,则在运行命令时提示要启动的服务子集。
${profileList} 如果已指定且 Docker Compose YAML 文件包含配置文件,则在运行命令时提示要启动的配置文件子集。
${composeCommand} 如果已设置,则设置为 containers.composeCommand 设置的值,否则扩展将尝试自动确定要使用的命令(docker composedocker-compose)。

Docker Compose Down

配置设置 默认值
containers.commands.composeDown ${composeCommand} ${configurationFile} down

支持的令牌

标记 描述
${configurationFile} 设置为 -f 加上所选 Docker Compose YAML 文件的相对于工作区的路径。
${composeCommand} 如果已设置,则设置为 containers.composeCommand 设置的值,否则扩展将尝试自动确定要使用的命令(docker composedocker-compose)。

其他支持的令牌

除了特定于命令的支持的令牌外,所有命令模板都支持以下令牌

标记 描述
${workspaceFolder} 所选工作区文件夹的路径。
${config:some.setting.identifier} 任何配置设置的值,只要它是字符串、数字或布尔值。这些设置标识符可以任意定义,不需要属于 Visual Studio Code 或任何扩展。
${env:Name} 环境变量的值。
${command:commandID} 命令的字符串返回值。