如何在 VS Code devcontainer 中运行 docker-compose

emz*_*ero 22 docker docker-compose visual-studio-code vscode-remote

我有这个多容器项目,由 3 个 NestJS 和 1 个 dotnet5.0 应用程序组成。除了应用程序之外,该项目还依赖于 RabbitMQ 和 InfluxDB 服务(作为纯 docker 镜像运行)

docker-compose文件如下所示:

version: '3.8'

services:
  influxdb:
    image: influxdb:2.0
    container_name: influxdb
    ports:
      - '8086:8086'
    expose:
      - '8086'
    volumes:
      - ./data/influxdb2/data:/var/lib/influxdb2
      - ./data/influxdb2/config:/etc/influxdb2

  rabbitmq:
    hostname: 'rabbitmq'
    image: rabbitmq:3-management
    container_name: rabbitmq
    ports:
      - '15672:15672'
      - '5672:5672'

  microservice1:
    image: microservice1
    container_name: microservice1
    depends_on: [rabbitmq, influxdb]
    build:
      context: .
      dockerfile: ./apps/microservice1/Dockerfile

  microservice2:
    image: microservice2
    container_name: microservice2
    depends_on: [rabbitmq, influxdb]
    build:
      context: .
      dockerfile: ./apps/microservice2/Dockerfile

  microservice3:
    image: microservice3
    container_name: microservice3
    depends_on: [rabbitmq, influxdb]
    build:
      context: .
      dockerfile: ./apps/microservice3/Dockerfile

  microservice4:
    image: microservice4
    container_name: microservice4
    depends_on: [rabbitmq, influxdb]
    build:
      context: .
      dockerfile: ./apps/microservice4/Dockerfile

Run Code Online (Sandbox Code Playgroud)

我想移动整个开发人员。环境到新的 VS Code devcontainers,但我不太了解如何使用依赖项(例如这里的rabbitmq和influxdb)。

理想情况下,我会在包含 Nodejs 和 dotnet SDK 的 devcontainer 中打开存储库,以便能够在开发过程中运行微服务。但是,我不想将 influxdb 和rabbitmq 安装到 devcontainer 中,因为我想利用现有的(且方便的)docker 镜像。

问题是,一旦我在 devcontainer 内打开存储库,就无法从内部与 docker-compose 交互(因为 docker/docker-compose 在 devcontainer 内不可用)。

是否可以从容器内部与主机上的 Docker 引擎交互?所以我可以简单地有一个dev.sh脚本,可以简单地使用uprabbitmq和influxdb依赖项,然后启动我想要运行的任何微服务?

也许我完全错了,但我找不到关于如何混合 VS Code devcontainers 和 docker-compose 文件(具有基于图像的依赖项)的明确解释。

mar*_*gas 20

vscode 只能使用一项服务作为 IDE 运行的“工作区”。就像在本地工作时一样,您在 IDE 上运行,而其他服务则在其他容器中运行。

您当前的服务似乎都不适合作为 IDE 工作区,因此您必须添加该服务。这将“就像”您的主机,但在容器中。

您可以使用多个撰写文件,这样您就可以避免更改当前文件docker-compose.yml,同时能够添加新服务。

所以,第一部分:

  1. 创建第二个docker-compose.yml文件(也许docker-compose.workspace.yml:)
  2. 向该文件添加一项服务,可以将其称为“工作区”。vscode Remote 部分将在那里运行。什么形象?你可以使用一个vscode 预煮的
  3. 指向.devcontainer.json这两个文件并定义工作区服务:
...
  "dockerComposeFile": [
    "docker-compose.yaml",
    "docker-compose.workspace.yaml"
  ],
  "service": "workspace",
...
Run Code Online (Sandbox Code Playgroud)

好的。这样就为您提供了工作区容器和侧面的其他所有内容。这就引出了问题的另一部分:

是否可以从容器内部与主机上的 Docker 引擎交互?所以我可以简单地有一个 dev.sh 脚本,它可以简单地启动rabbitmq和influxdb依赖项,然后启动我想要运行的任何微服务?

首先,如果您需要 docker 和 docker-compose 命令,则必须安装软件包。有些图像内置了它们,有些则没有。您可以使用自己的图像等。

但这还不够。您的工作区容器不知道主机的 docker。但这很容易修复。只需添加一个卷挂载:

/var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

关于工作区服务。这样,vscode 将“看到”您主机的 docker 并对其进行操作。

请注意,它仍然是主机的 docker,因此根据您的操作,您可能会遇到路径等问题。

  • 这是有道理的。谢谢! (2认同)