#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)
Проблема №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. Вы когда-нибудь находили решение этой проблемы?