Как правильно настроить файл docker-compose.yml, созданный Visual Studio (IDE)

#c# #docker #docker-compose

Вопрос:

Я использую C# в последней версии VS 2019 (Pro) на последней версии Windows 10 (Pro)

Я преобразовал свой проект (с помощью MS Assistant) из Net Framework в Net 5.0.

Все работает хорошо -> пока я не контейнеризую.

Предварительная контейнеризация: Моя архитектура процесса:

 Logger TseLogger
Search engine shard 1 of 2 (TseShard -shardId 0)
Search engine shard 2 of 2 (TseShard -shardId 1)
 

Обратите внимание, что код «осколка» является идентичным кодом. Различие заключается в параметре времени выполнения «shardId».

В моем решении я хочу запустить 1 регистратор и 2 осколка.

Я не мог понять, как сказать VS запустить 2 копии одного и того же проекта (каждая со своими собственными параметрами времени выполнения), чтобы (как клудж, чтобы я мог его протестировать) Я клонировал проект TseShard в проект «TseShard 2» и добавил его в список проектов для запуска.

Теперь я мог устанавливать точки останова в любом месте кода и выполнять отладку (по мере необходимости в один шаг).

Я счастлив, как свинья-в-сами-знаете-чем.

Следующим шагом была контейнеризация проектов.

Поэтому я хочу сгенерировать 2 изображения регистратора (Целоггер), фрагмент поисковой системы (Цешард)

И, исходя из изображений, создайте 3 контейнера: 1 регистратор и 2 осколка.

Я добавил поддержку оркестровки (docker-compose) в свое решение и поддержку Docker в свои проекты TseLogger и TseShard.

Я отредактировал файл автоматической генерации (по сравнению с 2019 годом) docker-compose.yml:

 version: '3.4'

services:
  tselogger:
    image: ${DOCKER_REGISTRY-}tselogger-2-3-0-6
    build:
      context: .
      dockerfile: TseLogger/Dockerfile

  tseshard0:
    image: ${DOCKER_REGISTRY-}tseshard0-2-3-0-6
    build:
      context: .
      dockerfile: TseShard/Dockerfile
    ports: [52949]
    volumes: 
        - d:/MyData:/MyData
    command: -shardId 0 

  tseshard1:
    image: ${DOCKER_REGISTRY-}tseshard1-2-3-0-6
    build:
      context: .
      dockerfile: TseShard/Dockerfile
    ports: [52950]
    volumes: 
        - d:/MyData:/MyData
    command: -shardId 1
 

Note that I added the suffix ‘-2-3-0-6’ (code assembly version) to the images.

Note also that I named the shard services as ‘tseshard0‘ and ‘tseshard1

My expectation is that it allows me to keep images of different code versions so Production can run a stable release while Dev will run new (test) releases.

My expectation is that I can reuse the same docker image (based on docker build of TseShard/Dockerfile) for both shards.

Anyway, it builds (seemingly correct).

For all its worth, the auto-generated (by VS) TseShard/Docker file (I did not edit this one):

 #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["TseShard/TseShard.csproj", "TseShard/"]
COPY ["Utils/Utils.csproj", "Utils/"]
COPY ["BinarySerialization/BinarySerialization.csproj", "BinarySerialization/"]
COPY ["Interfaces/Interfaces.csproj", "Interfaces/"]
COPY ["JsonCompare/JsonCompare.csproj", "JsonCompare/"]
COPY ["Networking/Networking.csproj", "Networking/"]
COPY ["FilterScoring/FilterScoring.csproj", "FilterScoring/"]
COPY ["DataAccess/DataAccess.csproj", "DataAccess/"]
COPY ["TseClient/TseClient.csproj", "TseClient/"]
RUN dotnet restore "TseShard/TseShard.csproj"
COPY . .
WORKDIR "/src/TseShard"
RUN dotnet build "TseShard.csproj" -c Debug -o /app/build

FROM build AS publish
RUN dotnet publish "TseShard.csproj" -c Debug -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "TseShard.dll"]
 

I set breakpoints at ‘Main’ for the logger and the shard code C# modules.

Finally, I start the docker-compose project.

It builds properly (so it seems).

Issue #1: I get an error message box from VS saying: Can not find the container with the name starting with ‘TseShard’ (see image below)

enter image description here

Проблема №2: Я не уверен, почему он ищет контейнер с именем «TseShard» (это имя проекта, а не имя изображения и не имя службы).

Проблема №3: Окно вывода из инструментов контейнера показывает:

 ========== Debugging ==========
docker ps --filter "status=running" --filter "label=com.docker.compose.service" --filter "name=^/TseShard$" --format {{.ID}} -n 1
========== Debugging ==========
docker ps --filter "status=running" --filter "label=com.docker.compose.service" --filter "name=^/TseShard$" --format {{.ID}} -n 1
 

Очевидно, что » докер ps «фильтрует» имя=^/TseShard$», которое ищет именно «TseShard».

Но я определил службы только для TseShard0 и TseShard1.

Смотрите прикрепленные изображения.

Докер показывает, что регистратор все еще работает, и два осколка вышли.

введите описание изображения здесь

Конечно, я не достиг точки останова (в буквальном начале «Main»).

Я был бы признателен за любую помощь в правильной настройке отладки, чтобы я мог установить точки останова.

В конечном счете я планирую заставить это работать в Linux 2 на AWS.

Заранее большое спасибо.

Комментарии:

1. Имея ту же самую проблему

2. Вы когда-нибудь находили решение этой проблемы?