现已推出!阅读 10 月的新功能和修复。

自定义 Docker 扩展

Docker 扩展包含多个 Visual Studio Code 任务,用于控制 Docker 构建运行 的行为,并构成容器启动以进行调试的基础。

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

Visual Studio Code 任务的所有常见功能(例如,将任务分组到复合任务中)都受 Docker 扩展任务支持。有关常见任务功能和属性的更多信息,请参阅 Visual Studio Code 的 自定义任务 文档。

Docker 构建任务

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

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

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

请参阅 属性参考,以获取所有任务属性的完整列表。

平台支持

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

Node.js(docker-build)

使用默认值进行最小配置

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

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

平台默认值

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

属性 推断值
dockerBuild.context package.json 相同的目录。
dockerBuild.dockerfile package.json 相同目录中的 Dockerfile 文件。
dockerBuild.tag package.json 中的应用程序的 name 属性(如果已定义),否则是包含 package.json 的文件夹的基名。

Python(docker-build)

使用默认值进行最小配置

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

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

平台默认值

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

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

.NET(docker-build)

使用默认值进行最小配置

构建基于 .NET 的 Docker 镜像时,可以省略 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 根工作区文件夹的基名。

构建任务参考

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

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

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

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

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

Docker 运行任务

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

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 的 Docker 镜像,如果没有特定的平台选项,可以将 platform 属性设置为 node

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

平台默认值

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

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

Python (docker-run)

构建基于 Python 的 Docker 镜像时,可以省略 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 镜像,docker-run 任务会推断以下选项

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

.NET (docker-run)

使用默认值进行最小配置

构建基于 .NET 的 Docker 镜像时,可以省略 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。使用的容器操作系统。 N/A
ports 要从容器发布(映射)到主机的端口。这是一个对象列表(见下文)。 -p--publish
portsPublishAll 是否发布 Docker 镜像公开的所有端口。如果未明确发布任何端口,则默认为 true -P
extraHosts 要添加到容器以进行 DNS 解析的主机。这是一个对象列表(见下文)。 --add-host
volumes 要映射到启动容器的卷。这是一个对象列表(见下文)。 -v--volume
remove 容器停止后是否删除容器。 --rm
customOptions 要在镜像参数之前添加的任何额外参数。不会尝试解决与其他选项的冲突或验证此选项。 (任何)

端口对象属性

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

extraHosts 对象属性

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

卷对象属性

属性 描述 默认
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 容器。该任务可以单独使用,也可以作为一系列任务的一部分,用于在 Docker 容器中调试应用程序。

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 <file>
envFile 读取并应用于容器的环境变量文件。 --env-file <file>
projectName 在命名和标记 Docker 对象时要使用的备用项目名称。如果在组合启动时使用备用项目名称,则在组合停止时必须指定相同的项目名称。 --project-name <name>

up 对象属性

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

down 对象属性

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

命令自定义

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

例如,Compose Up 命令中的 ${serviceList}${profileList} 令牌可以轻松地启动 Docker Compose YAML 文件中的一组服务。

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

设置 JSON 模式

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

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

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

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

{
  "docker.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. 检查约束模板。约束模板具有 match。将 match 正则表达式与上下文提示(例如,镜像名称、容器名称等)进行比较。
    2. 如果多个约束模板适用,则会提示用户选择。如果只有一个适用,则不会提示用户。
    3. 如果没有适用的约束模板,则检查不受约束的模板。不受约束的模板没有 match,因此始终适用。
    4. 如果多个不受约束的模板适用,则会提示用户选择。如果只有一个适用,则不会提示用户。

Docker 构建

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

支持的令牌

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

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

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

Docker 运行

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

支持的令牌

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

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

Docker 附加

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

支持的令牌

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

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

Docker 日志

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

支持的令牌

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

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

Docker Compose Up

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

支持的令牌

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

Docker Compose Down

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

支持的令牌

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

其他支持的令牌

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

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