🚀 在 VS Code 中

自定义 Docker 扩展

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

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

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

Docker build 任务

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 根工作区文件夹的基本名称。

Build 任务参考

以下是可用于配置 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 build 上下文的路径。
必需,除非从平台推断。
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 run 任务

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 回退文件夹。

Run 任务参考

以下是可用于配置 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 对象时使用的备用项目名称。如果在组合启动时使用备用项目名称,则在组合关闭时必须指定相同的项目名称。 --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. 检查受约束的模板。受约束的模板具有 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} 如果已设置,则为 docker.imageBuildContextPath 配置设置的值。否则,为 Dockerfile 所在的相对于工作区的文件夹。

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

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

Docker Run

配置设置 默认值
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 Attach

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

支持的令牌

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

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

Docker Logs

配置设置 默认值
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} 命令的字符串返回值。