Невозможно связаться между двумя одноуровневыми контейнерами - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть два проекта, один из которых является проектом API ядра Aspnet, а другой - проектом xUnit e2e, оба развернуты в двух разных контейнерах.

Когда оба контейнера запущены и работают, контейнер e2e пытается выполнить API-интерфейсы проекта Web API по URL-адресу https://web -api-container: 5010 / .Но проект e2e не может поразить проект API.Похоже, что проект API недоступен с его именем хоста (http://web -api-container: 5010 / ).Я получаю следующую ошибку в моем кли:

|Сообщение об ошибке: |System.Net.Http.HttpRequestException: соединение отказано |---- System.Net.Sockets.SocketException: соединение отказано |Трассировка стека: |в System.Net.Http.ConnectHelper.ConnectAsync (Строковый хост, порт Int32, CancellationToken cancellationToken) |в System.Threading.Tasks.ValueTask1.get_Result () |в System.Net.Http.HttpConnectionPool.CreateConnectionAsync (запрос HttpRequestMessage, CancellationToken cancellationToken) |в System.Threading.Tasks.ValueTask1.get_Result ()

Даже если я пытаюсь получить доступ к URL-адресу своего веб-API (http://web -api-container: 5010 / ) напрямуюиз браузера хост-машины я не могу получить доступ к сайту.Но если я перейду к http://localhost:5010/ из своего веб-браузера, я смогу получить ответ от API.

. / Source / WebAPI / Dockerfile:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY Source/WebAPI/WebAPI.csproj Source/WebAPI/
COPY Tests/WebAPI.UnitTests/WebAPI.UnitTests.csproj Tests/WebAPI.UnitTests/

RUN dotnet restore Tests/WebAPI.UnitTests/WebAPI.UnitTests.csproj
RUN dotnet restore Source/WebAPI/WebAPI.csproj

COPY . .

WORKDIR /src/Tests/WebAPI.UnitTests/
RUN dotnet build && dotnet test -c Release /p:CollectCoverage=true /p:CoverletOutputFormat=json /p:CoverletOutput=./TestResults/Coverage/


WORKDIR /src/Source/WebAPI
RUN dotnet build WebAPI.csproj -c Release -o /app



FROM build AS publish
RUN dotnet publish WebAPI.csproj -c Release -o /app

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

. / Тесты / WebAPI.EndToEndTests / Dockerfile:

#pull from microsoft/dotnet
FROM microsoft/dotnet:2.1.301-sdk AS build

WORKDIR /src

# copying
COPY Tests/WebAPI.EndToEndTests/WebAPI.EndToEndTests.csproj Tests/WebAPI.EndToEndTests/

#restore 
RUN dotnet restore Tests/WebAPI.EndToEndTests/WebAPI.EndToEndTests.csproj

#copy rest
COPY . .

#build
WORKDIR /src/Tests/WebAPI.EndToEndTests
RUN dotnet build
CMD ["sh", "-c", "sleep 1m && dotnet test --logger trx"]

. / Docker-compose.yml:

version: '3.4'

services:
  webapi:
    container_name: web-api-container
    image: web-api-image
    build:
      context: .
      dockerfile: Source/WebAPI/Dockerfile
    ports:
      - 5010:80
      - 5001:443
    networks: 
      - my-network

  webapiendtoend:
    container_name: e2e-test-container
    image: Web-api-endtoend-test-image
    build:
      context: .
      dockerfile: Tests/WebAPI.EndToEndTests/Dockerfile
    networks:  
      - my-network

  rabbitmq:
    container_name: rabbitmq-container
    image: "rabbitmq:3.7-management"
    ports:
      - 5672:5672
      - 15672:15672
    tty: true
    networks:  
      - my-network
    volumes:
      - ./Source/WebAPI/RabbitMQConfig/rabbitmq.config:/etc/rabbitmq/rabbitmq.config:ro
      - ./Source/WebAPI/RabbitMQConfig/definitions.json:/etc/rabbitmq/definitions.json:ro

networks:
  my-network:

Tests \ WebAPI.EndToEndTests \ appsettings.json:

{
  "MessageQueueApi": {
    "Url": "http://web-api-container:5010/"
  }
}

. / Tests / WebAPI.EndToEndTests / Test / BaseTest.cs:

public class BaseTest : IDisposable
    {
        public BaseTest()
        {
            var appSettings = AppSettings.Current;
            var httpClientHandler = new HttpClientHandler()
            {
                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
            };
            this.HttpClient = new HttpClient(httpClientHandler)
            {
                BaseAddress = appSettings.MessageQueueApi.Url,

            };
            Console.WriteLine("<---API URL is --->" + appSettings.MessageQueueApi.Url);

            Console.WriteLine("---Base address");
            Console.WriteLine(this.HttpClient.BaseAddress);
        }

        public HttpClient HttpClient { get; set; }

        public List<string> AllValues { get; set; }

        public void Dispose() => this.HttpClient.Dispose();

        protected async Task GetAllValues()
        {
            Console.WriteLine("----in get all values---");
            var response  = await this.HttpClient.GetAsync("api/values");
            response.StatusCode.ShouldBe(HttpStatusCode.OK);         
        }


        protected Task<HttpResponseMessage> ClearCache() =>
            this.HttpClient.PostAsJsonAsync("cache/clear", string.Empty);
    }

1 Ответ

0 голосов
/ 11 декабря 2018

5010 - порт, доступный хост-машине.Вы можете общаться, используя порт контейнера в контейнерах.Используйте порт 80 вместо 5010.

http://web-api-container:80

, это сделает работу.

...