1

I am trying to launch my C# ASP.NET MVC app along side of a postgres server in 2 respective docker containers running on the same docker network. It won't work. The following is the relevant code.

appsettings.Development.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "ConnectionStrings": {
    "db": "Host=localhost;Database=amaranth_tests;Username=amaranth_test_user;Password=postgrespw123;Port=5432"
  }
}

appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "db": ""
  },
  "ApiEndpoints": {
    "TestNet": [
      "https://api.bitcore.io/api/BTC/testnet/",
      "https://api.blockcypher.com/v1/btc",
      "<API KEY HERE>"
    ],
    "MainNet": [
      "https://api.bitcore.io/api/BTC/mainnet/",
      "https://api.blockcypher.com/v1/btc",
      "<API KEY HERE>"
    ],
    "db": "Host=localhost;Database=amaranth_tests;Username=amaranth_test_user;Password=postgrespw123;Port=5432",
  }
}

docker-compose.yml:

version: '3.8'

volumes:
  data:

networks:
  api-dev:
    driver: bridge

services:
  postgresql:
    image: postgres
    # explicit container name
    container_name: postgresql
    environment:
      - POSTGRES_USER=amaranth_test_user
      - POSTGRES_PASSWORD=postgrespw123
      - POSTGRES_DB=amaranth_tests
    ports:
      - 5432:5432
    volumes:
      - data:/var/lib/postgresql
    networks:
      - api-dev
  amaranth_main:
    container_name: amaranth_main
    links:
      - postgresql
    depends_on:
      - postgresql
    build:
      context: .
      dockerfile: Dockerfile
    networks:
      - api-dev
    ports:
      - "8000:80"
    command: ["./wait-for-postgres.sh", "postgresql", "dotnet", "amaranth.dll"]

Dockerfile:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app

# Copy everything
COPY . ./
# Restore as distinct layers
ENV PATH $PATH:/root/.dotnet/tools
RUN dotnet tool install -g dotnet-ef --version 6.0.8
RUN dotnet restore
RUN dotnet ef database update
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "amaranth.dll"]
#!/bin/sh
# wait-for-postgres.sh

set -e
  
host="$1"
shift
  
until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done
  
>&2 echo "Postgres is up - executing command"
exec "$@"

All of the above files including the actual app are in the root directory of the app amaranth.

The problem is that when I run docker-compose up, I get this error in my terminal.

#10 6.663 Failed to connect to [::1]:5432

It fails on this step in the Dockerfile RUN dotnet ef database update. From the terminal it appears that it didn't wait for postgresql container to finish being initiated before the ASP.NET app started running, even though I added the depends_on: parameter and the "./wait-for-postgres.sh" command to amaranth_main (the ASP.NET container) in the docker-compose file. So why isn't this working?

Also

I tried using Host=postgresql instead of Host=localhost, and I got #13 6.506 Name or service not known

1 Answer 1

4

The Problem is with connectionstring, inside the container network it can't connect localhost, as it will try to find localhost within container, in case of docker-compose you need to use servicename to reach postgres container, which in your case it is "postgresql".

so your connection string in appsettings.json should be

db="Host=postgresql;Database=amaranth_tests;Username=amaranth_test_user;Password=postgrespw123;Port=5432",

Alternatively you can pass the connectionstring in docker-compose file for amaranth_main as

environment:
      - ConnectionStrings__db=Host=postgresql;Database=amaranth_tests;Username=amaranth_test_user;Password=postgrespw123;Port=5432

Hope it helps.

updated ans based on further discussion:

RUN dotnet ef database update this needs to have database running but during image generation it is not running in your case. so it is better to do migration inside code. You can remove database update from dockerfile and perform within the code during startup. that's the best practice followed generally. also

you can check this link. it has detail article on how to do migration on strartup.

Sign up to request clarification or add additional context in comments.

12 Comments

I got #13 6.506 Name or service not known error instead when I changed the db connection string to what you have.
ok. one basic question, when generating the image using dockerfile, your database is running ? , I doubt it is not running. and by the way if you are using code first approach to update your database on startup then you are doing wrong way. it should not be part of your dockerfile but it should be part of your startup code.
code first approach? What is that? Do you mean that I should try to connect with the docker environment string ConnectionStrings__db? because I tried that too and it didn't work (same error)
no why do you need RUN dotnet ef database update this part ? this generally indicates that you are trying to update the database with migration files., is it the case ?
Could be because of bridge driver. What happens if you remove driver: bridge line leaving only above api-dev: network?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.