简体   繁体   中英

How to dynamically change database from local to external inside docker-compose

I'm trying to configure my docker-compose file so that it automatically connects to the right database depending on the credentials provided in the .env file. Connecting to the local database doesn't cause any problems, but connecting to the remote one doesn't work. Returns error port 5432 failed: FATAL: password authentication failed for user

docker-compose.yml

version: "3.9"
services:
  panel:
    env_file: .env
    restart: always
    build: .
    ports:
      - "8000:8000"
    command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/app
    depends_on:
      - db
    environment:
      - DB_HOST=db
  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=${DB_NAME}
      - DB_HOST=${DB_HOST}

volumes:
  postgres_data:

.env file

DB_NAME=panel_db
DB_USER=db_root
DB_PASSWORD=i8sfsfdhisdu9sd8sjdis
DB_PORT=5432
DB_HOST=localhost

# remote
# DB_NAME=remote_panel_db
# DB_USER=gpanel
# DB_PASSWORD=yG8W5rxeggAasdffsdTolG
# DB_HOST=....rds.amazonaws.com
# DB_PORT=5432

In this form, I connect to the local base without any problems.

Now I am trying to uncomment the remote database access credentials

#DB_NAME=panel_db
#DB_USER=db_root
#DB_PASSWORD=i8sfsfdhisdu9sd8sjdis
#DB_PORT=5432
#DB_HOST=localhost

# remote
DB_NAME=remote_panel_db
DB_USER=gpanel
DB_PASSWORD=yG8W5rxeggAasdffsdTolG
DB_HOST=....rds.amazonaws.com
DB_PORT=5432

And it's not working anymore.

I'm assuming it's the line

environment:
  - DB_HOST=db

But I can't figure out what to change

Could you confirm you are able to connect to remote DB? You can attach to running container by docker exec -it <container_name> /bin/bash or run new container by docker run <container_name> -it /bin/bash

then use psql to connect to your DB to verify you are able to connect from there psql -h <hostname or ip address> -p <port number of remote machine> -d <database name which you want to connect> -U <username of the database server>

Since you have both env_file: and environment: , the documentation for env_file: notes:

Environment variables declared in the environment section override these values – this holds true even if those values are empty or undefined.

So when your Compose file has

env_file: .env
environment:
  - DB_HOST=db

the value of $DB_HOST is always db ; the value from the .env file is ignored. In the remote case you're trying to connect to the Compose database but with your RDS credentials.

Since you declare DB_HOST in both .env files, you don't need it in the docker-compose.yml . Just delete that entire environment: block.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM