在Docker容器中,找不到testing.postgresql命令: initdb。

6

你好,我正在尝试使用SQLAlchemy和Alembic创建一个使用PostgreSQL数据库的单元测试。

同时,我将其运行在Docker PostgreSQL上。

我正在遵循testing.postgresql的文档(文档)来设置一个临时的PostgreSQL实例来处理数据库测试,并编写了以下测试:

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')

crawl_bds_obj()基本上是从URL保存信息并使用session.commit()保存到数据库,然后返回类型数据。

当我尝试运行测试时,它返回以下错误:

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

在文档中提到:"testing.postgresql.Postgresql在实例化时执行initdb和postgres。 删除Postgresql对象时,它会终止PostgreSQL实例并删除临时目录。"。
那么为什么我已经安装了testing.postgresql,并在我的docker上运行了postgresql,却仍然出现initdb错误?
编辑:我也设置了我的数据路径,但仍返回相同的错误。
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')

1个回答

1

您需要以postgresql用户身份而不是root运行此命令,因此您可以尝试使用以下命令来运行您的命令:

runuser -l  postgres -c 'command'    

或者

su -c "command" postgres

或者在您的 Dockerfile 中添加 USER postgres,并检查要求:
Python 2.6, 2.7, 3.2, 3.3, 3.4, 3.5
pg8000 1.10

更新

为了使copy_data_from正常工作,您需要先生成文件夹:

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

然后添加这个:

pg = testing.postgresql.Postgresql(copy_data_from='myData')

但是我已经在docker-compose中的postgres环境变量中设置了POSTGRES_USER=postgres并设置了其密码,那么我需要在我的dockerfile中再次添加吗? - Linh Nguyen
重新构建时,Docker文件中是否需要其他内容?出现“无法启动服务工作者:无法找到用户postgres:passwd文件中没有匹配条目”的错误。 - Linh Nguyen
我已经对我的帖子进行了编辑,加入了Dockerfile和Docker Compose代码。 - Linh Nguyen
我使用docker exec登录到我的postgres /bin/bash,并使用“find . -name 'initdb'”命令找到了路径“./usr/lib/postgresql/11/bin/initdb”,但不知何故出现了错误“Service 'worker' failed to build: The command '/bin/sh -c ./usr/lib/postgresql/11/bin/initdb -D myData -U postgres'”。我找错路径了吗? - Linh Nguyen
从路径中删除点号。 - LinPy
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接