Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

testing.postgresql command not found: initdb inside docker

Hi i'm trying to make a unittest with postgresql database that use sqlalchemy and alembic

Also im running it on docker postgresql

I'm following the docs of testing.postgresql(docs) to set up a temporary postgresql instance handle database testing and wrote the the following test:

def test_crawl_bds_obj(self):
    with testing.postgresql.Postgresql() as postgresql:
        engine.create_engine(postgresql.url())
        result = crawl_bds_obj(1 ,'/ban-can-ho-chung-cu-duong-mai-chi-tho-phuong-an-phu-prj-the-sun-avenue/nh-chu-gap-mat-tien-t-q2-thuoc-du-tphcm-pr22171626')
        self.assertEqual(result, 'sell')

The crawl_bds_obj() basically save information from an URL and save it to the database using session.commit() and return the type data

When i tried to run the test it return the following error:

ERROR: test_crawl_bds_obj (tests.test_utils.TestUtils)
raise RuntimeError("command not found: %s" % name)
RuntimeError: command not found: initdb

In the docs it said that "testing.postgresql.Postgresql executes initdb and postgres on instantiation. On deleting Postgresql object, it terminates PostgreSQL instance and removes temporary directory."

So why am i getting initdb error when i already installed testing.postgresql and had postgresql running on my docker?

EDIT:

I aslo had set my data path but it still return the same error

dockerfile:

FROM python:slim-jessie
ADD requirements.txt /app/requirements.txt
ADD . /app/
WORKDIR /app/
RUN pip install -r requirements.txt

docker-compose:

  postgres:
    image: postgres
    restart: always
    environment:
      - POSTGRES_USER=${POSTGRES_DEFAULT_USER}
      - POSTGRES_PASSWORD=${POSTGRES_DEFAULT_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DEFAULT_DB}
      - POSTGRES_PORT=${POSTGRES_DEFAULT_PORT}
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
  pgadmin:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
    volumes:
       - ./data/pgadmin:/root/.pgadmin
    ports:
      - "${PGADMIN_PORT}:80"
    logging:
      driver: none
    restart: unless-stopped

  worker:
    build:
      context: .
      dockerfile: Dockerfile
    command: "watchmedo auto-restart --recursive -p '*.py'"
    environment:
      - C_FORCE_ROOT=1
    volumes:
      - .:/app
    links:
      - rabbit
    depends_on:
      - rabbit
      - postgres

testing.postgresql.Postgresql(copy_data_from='data/postgres:/var/lib/postgresql/data')

like image 813
Linh Nguyen Avatar asked Nov 06 '22 14:11

Linh Nguyen


1 Answers

you need to run this command as postgresql user not root, so you may try to run your commands using:

runuser -l  postgres -c 'command'    

or

su -c "command" postgres

or add USER postgres to your Dockerfile

and check the requirments:

Python 2.6, 2.7, 3.2, 3.3, 3.4, 3.5
pg8000 1.10

UPDATE

To make copy_data_from works you should generate the folder first:

FROM python:slim-jessie
ADD requirements.txt /app/requirements.txt
ADD . /app/
WORKDIR /app/
RUN pip install -r requirements.txt
RUN /PATH/TO/initdb -D myData -U postgres

and then add this:

pg = testing.postgresql.Postgresql(copy_data_from='myData')
like image 122
LinPy Avatar answered Nov 12 '22 19:11

LinPy