在 VS Code 中试用

自定义 Docker 扩展

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

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

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

Docker 构建任务

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

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

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

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

平台支持

尽管 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 在镜像参数之前添加的任何额外参数。不会尝试解决与其他选项的冲突或验证此选项。 (任意)

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 容器。该任务可以单独使用,也可以作为任务链的一部分,用于在 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 对象时要使用的备用项目名称。如果在使用 alternate project name 进行 compose up 时使用了备用项目名称,则在使用 compose down 时必须指定相同的项目名称。 --project-name <name>

up 对象属性

属性 描述 CLI 等效项 默认值
detached 是否以后台模式运行。 -d true
build 运行前是否构建。 --build true
scale 要运行的每个服务的实例数。这是一个键值对列表。 --scale SERVICE=NUM
services 要启动的服务子集。不能与 profiles 结合使用。 [SERVICE...] (全部)
profiles 要启动的配置文件子集。不能与 services 结合使用。 --profile <profile> (全部)
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,则在此处替换,否则替换为 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 文件包含 profiles,在运行命令时会提示选择要启动的 profiles 子集。
${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} 命令的字符串返回值。