Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Asp.net Core 2.0 com container docker .

Olá pessoal,

Estou desenvolvendo um aplicativo com um time e decidimos desenvolver o backend em uma API Asp.net Core 2.0.

Até aí tudo bem, o sistema funciona perfeitamente e tudo roda maravilhosamente bem quando compilamos tanto em Windows quanto em linux.

Cada um do time tem uma máquina diferente, com SOs diferentes e decidimos montar um ambiente no Vagrant, com os projetos, frontend + backend + db, em containers docker, até mesmo pra quando o time crescer ficar mais fácil.

Cada projeto tem a sua porta definida, o frontend na 4200 e o backend na 3000.

Criamos o DockerFile para o frontend, pro backend e geramos um docker-compose.yml, tudo nos conformes.

O problema é: Eu até consigo rodar a aplicação, comunicar com o banco e tudo mais, só que quando eu tento acessar algum endpoint da API pelo browser ou pelo Postman, não funciona nem com reza brava.

Esses são os arquivos que eu criei:

Vagrant

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.provision :docker
  config.vm.provision :docker_compose
  config.vm.provision :shell, path: "./bootstrap.sh", run: 'always'

  # fsnotify will notify the guest machine about changes in partywise-docker/partywise-client allowing live-reload
  config.vm.synced_folder "./projeto-docker/projeto-client", "/vagrant/projeto-docker/projeto-client", fsnotify: true, exclude: ["node_modules", ".idea"]

  config.vm.network "forwarded_port", guest: 3000, host: 3000
  config.vm.network "forwarded_port", guest: 4200, host: 4200
  config.vm.network "forwarded_port", guest: 5432, host: 5432

  config.vm.provider "virtualbox" do |v|
    v.memory = 4048
    v.cpus = 2
  end
end

DockerFile Backend

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
ENV ASPNETCORE_URLS http://+:3000

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY Projeto.Core/Projeto.Core.csproj Projeto.Core/
RUN dotnet restore Projeto.Core/Projeto.Core.csproj
COPY . .
WORKDIR /src/Projeto.Core
RUN dotnet build Projeto.Core.csproj -c Release -o /app

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

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

docker-compose

version: "3.5"

x-defaults: &defaults
  tty: true
  stdin_open: true

services:
  core:
    <<: *defaults
    build:
      context: ./projeto-core
      dockerfile: Projeto.Core/Dockerfile
    ports:
      - "3000:3000"
    links:
      - db

  client:
    <<: *defaults
    hostname: client
    build:
      context: ./projeto-client
      dockerfile: Dockerfile.dev
    volumes:
      - node-modules-cache:/opt/webapps/projeto-client/node_modules:cached
      - ./projeto-client:/opt/webapps/projeto-client
    ports:
      - "4200:4200"

  nginx:
    <<: *defaults
    image: nginx
    hostname: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "80:80"

  db:
    image: postgres:10.1
    hostname: db
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  pgdata:
    name: pgdata
  node-modules-cache:
    name: node-modules-cache

O frontend está perfeito, mas a API asp.net core não.

Espero que alguém consiga me dar uma luz.

Abraços.

6 respostas

Olá, Silvio, tudo bem? Que tipo de erro está sendo retornado quando o POSTMAN faz a chamada?

Could not get any response
There was an error connecting to http://localhost:3000/api/users/.
Why this might have happened:
The server couldn't send a response:
Ensure that the backend is working properly
Self-signed SSL certificates are being blocked:
Fix this by turning off 'SSL certificate verification' in Settings > General
Proxy configured incorrectly
Ensure that proxy is configured correctly in Settings > Proxy
Request timeout:
Change request timeout in Settings > General

O container não é visto nem no vagrant nem no meu windows.

Se eu tento pelo curl dentro do vagrant..

curl: (52) Empty reply from server

Olá, Silvio

Existe uma thread bem extensa lá no fórum do Postman no GitHub

https://github.com/postmanlabs/postman-app-support/issues/3127

Veja se seu problema é parecido com este:

Vou colocar aqui algumas soluções encontradas pelos usuários:

Um usuário resolveu um problema semelhante da seguinte forma:

  1. Procure no canto superior direito o ícone de "SETTINGS", ao lado do ícone de coração
  2. Na nova janela SETTINGS, veja a seção "HEADERS"
  3. Desabilitar opção "Send Postman Token Header"

Outro usuário resolveu mudando esta opção:

setting ->general -> Requesttimeout in ms = 0

Outro usuário conseguiu usando a extensão do Chrome, em vez do app Windows**

Outro usuário resolveu mudando a configuração: setting>general>SSL certificate verification == off

Outro usuário descobriu que o access token tinha uma linha em branco no final, e resolveu removendo um caractere de "nova linha" ao final do "access token" que tinha sido adicionado com CTRL+C CTRL+V

Outro usuário resolveu clicando no ícone "satélite"...

... e adicionando a porta 8080 no proxy:

solução!

Oi Marcelo,

Acho que meu problema não ficou muito claro.

O problema não está no Postman em si. Ele está nas configurações do meu Docker.

Eu não consigo enxergar o projeto fora do container, nem no browser do windows, nem no postman e nem via curl no vagrant.

Eu só consigo rodar a API dentro do container, como abaixo:

root@6a81454650f8:/# curl -X POST \
>   http://localhost:3000/api/users/ \
>   -H 'Cache-Control: no-cache' \
>   -H 'Content-Type: application/json' \
>   -H 'Postman-Token: 093a33db-0f88-485f-89b9-8744a01eecda' \
>   -d '{
>   "UserID":"user", "Password":"senha"
> }'
{"authenticated":true,"createdAt":"2018-08-09T16:04:56.9437067+00:00","expirationDate":"2018-08-09T16:06:56.9437067+00:00","accessToken":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6WyJzY2FldGFuby50cmFiYWxob0BnbWFpbC5jb20iLCJzY2FldGFuby50cmFiYWxob0BnbWFpbC5jb20iXSwianRpIjoiNDQ4M2FmMGQxMzJiNDBkYmI3N2ZjMDdkNmUzMjhkMTciLCJuYmYiOjE1MzM4MzA2OTYsImV4cCI6MTUzMzgzMDgxNiwiaWF0IjoxNTMzODMwNjk2LCJpc3MiOiJQYXJ0eUJveElzc3VlciIsImF1ZCI6IlBhcnR5Qm94QXVkaWVuY2UifQ.WtsfqBBYhePKTwH7gCElB0igZir7y636VpcClUKhK5K8EXuwfGYsmucgaQJQIPyiXJLL2RCwAM7nwtk7z0zrGmRmuQ-ktQT0cof6dnvXOF_gRef0OK8avO9gZ-IjkYpOKrJ3n2p65AQIZIl_FtADLvIeH4f38iMZEI3SWZ27O-F2_1pwtiJVWLzb_dAanyxNwJdqUG5DI7NPUgiAv1eTqlzj3XEuJZNtUpHGG2PwYYW2GBD1_6Bcc4ADyAzkyeXqQxKhndncgYKqJ-xVqP9dMoRr-xk3jfgiHgy1tvPWZBiad4Q__d5KK6riCTI_fCoplkalfm1D_59kBEJzFz9PYg","message":"Authentication Successful!"}root@6a81454650f8:/#

Reparou que eu mandei o token do postman e mesmo assim ele rodou legal no container?

Então, está funcionando, mas não consigo ver "de fora".

Olá,

Para deixar um feedback e caso alguém necessite, resolvi o problema modificando o arquivo docker e o docker-compose.yml.

No docker eu retirei a variável de ambiente e apontei para a porta 3000.

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 3000

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY Projeto.Core/Projeto.Core.csproj Projeto.Core/
RUN dotnet restore Projeto.Core/Projeto.Core.csproj
COPY . .
WORKDIR /src/Projeto.Core
RUN dotnet build Projeto.Core.csproj -c Release -o /app

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app .

ENTRYPOINT ["dotnet", "Projeto.Core.dll"]

No docker-compose.yml, eu alterei os projetos core e db adicionando network mode host.

version: "3.5"

x-defaults: &defaults
  tty: true
  stdin_open: true

services:
  core:
    <<: *defaults
    build:
      context: ./projeto-core
      dockerfile: Projeto.Core/Dockerfile
    ports:
      - "3000:3000"
    depends_on:
      - db
    network_mode: host

  client:
    <<: *defaults
    hostname: client
    build:
      context: ./projeto-client
      dockerfile: Dockerfile.dev
    volumes:
      - node-modules-cache:/opt/webapps/projeto-client/node_modules:cached
      - ./projeto-client:/opt/webapps/projeto-client
    ports:
      - "4200:4200"

  nginx:
    <<: *defaults
    image: nginx
    hostname: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "80:80"

  db:
    image: postgres:10.4
    hostname: db
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=projeto_core_development
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    network_mode: host

volumes:
  pgdata:
    name: pgdata
  node-modules-cache:
    name: node-modules-cache

Agora é possível acessar pela máquina host sem problemas, com o Postman ou Browser.

Eu escolhi o post errado como resposta, se alguém puder editar, seria incrível.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software