如何 运行 docker-compose inside VS Code devcontainer

How to run docker-compose inside VS Code devcontainer

我有一个由 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

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

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

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

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

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

我最近开始自己蒙混过关,将分享我的工作。我仍然对权限感到困惑,但是 运行 作为 root,一切都很好。因此,据我所知,您不需要更改工作 docker-compose.yml 文件中的任何内容。我的看起来像这样:

version: '3.9'

services:
    app:
        build:
            context: ./
            dockerfile: Dockerfile
        command: sleep infinity
        user: root
        ports:
            - 5001:5001
            - [snip]
        depends_on:
            - mysql
    mysql:
        image: mysql:8
        ports:
            - 3306:3306
        restart: unless-stopped
        environment:
            MYSQL_ROOT_PASSWORD: myRootpwd32

取自 VS Code 生成的标准 Dockerfile(为简洁起见截断):

# [Choice] .NET version: 5.0, 3.1, 2.1
ARG VARIANT="3.1"
FROM mcr.microsoft.com/vscode/devcontainers/dotnet:0-${VARIANT}

# [Option] Install Node.js
ARG INSTALL_NODE="true"
ARG NODE_VERSION="lts/*"
RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi

最后 devcontainer.json:

{
    "name": "C# (.NET)",
    "dockerComposeFile": "docker-compose.yml",
    "service": "app",
    "workspaceFolder": "/workspaces/MemberCore",

    // Set *default* container specific settings.json values on container create.
    "settings": {
        "terminal.integrated.shell.linux": "/bin/bash"
    },

    // Add the IDs of extensions you want installed when the container is created.
    "extensions": [
        "ms-dotnettools.csharp",
        "wakatime.vscode-wakatime",
        "fernandoescolar.vscode-solution-explorer",
        "adrianwilczynski.add-reference",
        "kreativ-software.csharpextensions",
        "k--kato.docomment",
        "pranaygp.vscode-css-peek",
        "dbaeumer.vscode-eslint",
        "patcx.vscode-nuget-gallery",
        "derivitec-ltd.vscode-dotnet-adapter"
    ],
}

关键显然在 dockerComposeFile 行中,它可以让您重新使用已经在此处编写的内容。

我的很多信息都来自这个 repo:https://github.com/0916dhkim/vscode-devcontainer-tutorial 它有一个从头开始的完整工作示例。

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

您当前的

None 服务作为 IDE 工作区似乎“不错”,因此您必须添加该服务。那将“就像”您的主机,但在容器中。

您可以使用 multiple compose files,这样您就可以在添加新服务的同时避免更改当前的 docker-compose.yml

所以,第一部分:

  1. 创建第二个 docker-compose.yml 文件(也许:docker-compose.workspace.yml
  2. 向该文件添加一项服务,可以将其称为“工作区”。 vscode 远程部分会 运行 在那里。什么形象?您可以使用一个 vscode's precooked ones.
  3. .devcontainer.json 上指向两个文件并定义工作区服务:
...
  "dockerComposeFile": [
    "docker-compose.yaml",
    "docker-compose.workspace.yaml"
  ],
  "service": "workspace",
...

好的。这样就为您提供了工作区容器和侧面的所有其他东西。这让我们进入了问题的另一部分:

Is it possible to interact with Docker engine on the host from inside the container? So I can simply have a dev.sh script that can simply up the rabbitmq and influxdb dependencies and then launch whatever microservice I want to run?

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

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

/var/run/docker.sock:/var/run/docker.sock

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

注意它仍然是主机的 docker,因此您可能会遇到路径等问题,具体取决于您的操作。