簡體   English   中英

Docker 與 conda 環境和 postresql 數據庫組合 - 無法連接到服務器:連接被拒絕

[英]Docker compose with conda enviroment and postresql database - could not connect to server: Connection refused

我試圖對在 conda 環境中運行的 python 應用程序進行 dockerize,並使用 sqlalchemy 查詢 postgresql 數據庫。 我已經成功地運行了我的 conda env 並在其上運行了 jupyter,我還設法單獨運行了一個 postgres 圖像,並且我用這兩個服務構建了一個 docker-compose.yml,但我無法讓它們一起工作。

我在安裝了 conda env 的 jupyter 筆記本上運行以下代碼,並且我得到 (psycopg2.OperationalError) 無法連接到服務器:連接被拒絕。

import sqlalchemy
engine = sqlalchemy.create_engine('postgres://admin:admin@localhost:5432/postgresdb')
engine.connect()

我對 docker 很陌生,所以我確定我的配置有誤,任何幫助都會很棒。

配置

  • Docker 組成:
version: "3"

services:
  database:
    container_name: postgres
    image: 'bitnami/postgresql:12'
    environment:
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
      - POSTGRES_HOST=localhost
      - POSTGRES_PORT=5432
      - POSTGRES_DB=postgresdb
    ports:
      - "5432:5432"
    volumes:
      - db_volume:/var/lib/postgresql

  jupyter-conda:
    build: .
    ports:
      - "8888:8888"
    depends_on:
      - database

volumes:
  db_volume:
  • Dockerfile:
FROM ubuntu

SHELL [ "/bin/bash", "--login", "-c" ]

# Create a non-root user
ENV USER arquimedes
ENV UID 1000
ENV GID 1000
ENV HOME /home/$USER
RUN adduser --disabled-password \
    --gecos "Non-root user" \
    --uid $UID \
    --home $HOME \
    $USER

RUN apt-get update
RUN apt-get install wget -y

COPY environment.yml requirements.txt /tmp/
RUN chown $UID:$GID /tmp/environment.yml /tmp/requirements.txt

COPY postBuild /usr/local/bin/postBuild.sh
RUN chown $UID:$GID /usr/local/bin/postBuild.sh && \
    chmod u+x /usr/local/bin/postBuild.sh

COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chown $UID:$GID /usr/local/bin/entrypoint.sh && \
    chmod u+x /usr/local/bin/entrypoint.sh

USER $USER
# install miniconda
ENV MINICONDA_VERSION latest
ENV CONDA_DIR $HOME/miniconda3
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-$MINICONDA_VERSION-Linux-x86_64.sh -O ~/miniconda.sh && \
    chmod +x ~/miniconda.sh && \
    ~/miniconda.sh -b -p $CONDA_DIR && \
    rm ~/miniconda.sh
# make non-activate conda commands available
ENV PATH=$CONDA_DIR/bin:$PATH
# make conda activate command available from /bin/bash --login shells
RUN echo ". $CONDA_DIR/etc/profile.d/conda.sh" >> ~/.profile
# make conda activate command available from /bin/bash --interative shells
RUN conda init bash

# create a project directory inside user home
ENV PROJECT_DIR $HOME/conda-oracle
RUN mkdir $PROJECT_DIR
WORKDIR $PROJECT_DIR

# build the conda environment
ENV ENV_PREFIX $PROJECT_DIR/env
RUN conda update --name base --channel defaults conda && \
    conda env create --prefix $ENV_PREFIX --file /tmp/environment.yml
# run the postBuild script to install any JupyterLab extensions
RUN conda activate $ENV_PREFIX && \
    /usr/local/bin/postBuild.sh && \
    conda deactivate

ENTRYPOINT [ "/usr/local/bin/entrypoint.sh" ]

# expose port the api
EXPOSE 8888

# password for jupyter
ENV JUPYTER_TOKEN eureka

# copy source files 
COPY --chown=$UID:$GID /src $PROJECT_DIR/src

# inicializar el container con jupyter
CMD [ "jupyter", "lab", "--no-browser", "--ip", "0.0.0.0" ]

docker-container up 輸出

數據庫輸出

編輯:第 2 部分

因此,由於 jabbsons 的回答,我現在能夠連接到數據庫,但我現在無法與數據庫交互。 我試圖從 Pandas 發布一個數據庫然后查詢它,我能夠發布但查詢時出錯,有人知道我做錯了什么嗎? 非常感謝您的參與! 代碼如下。

import pandas as pd
from datetime import date
from typing import Dict, Optional, Any
from sqlalchemy import create_engine
from sqlalchemy.types import CHAR, INTEGER, DATE

CREDENTIALS = 'postgresql://admin:admin@database:5432/postgresdb' 

def create_table_from_pandas(df: pd.DataFrame, table_name: str, schema: Dict[str, Any], chunksize: int = None) -> None:
    conection = create_engine(CREDENTIALS)

    # if_exists='replace' borra primero todo lo previo que haya en la tabla temporal
    df.to_sql(
        name=table_name,
        con=conection,
        if_exists="replace",
        index=False,
        dtype=schema,
        chunksize=chunksize,
    )

def execute_query(query: str, params: Optional[Dict[str, str]] = None) -> pd.DataFrame:
    conection = create_engine(CREDENTIALS)

    df_result = pd.read_sql(query, params=params, con=conection)

    return df_result

df_test = pd.DataFrame({'COL1':[1,2,3,4,5], 'COL2':['a','b','c','d','e'], 'COL3':[date.today()]*5})

df_scheema = {
    "COL1": INTEGER(),
    "COL2": CHAR(20),
    "COL3": DATE(),
}

create_table_from_pandas(df_test, 'DFTEST', df_scheema)

一切都很好,直到這一點,然后我運行:

execute_query("SELECT * FROM DFTEST")

並得到:UndefinedTable:關系“dftest”不存在

如果我跑

execute_query("SELECT * FROM information_schema.tables WHERE table_name = 'DFTEST'")

我可以看到表格截圖熊貓表

再次,非常感謝您的時間,我對這一切還是很陌生。

您從 jupyter 筆記本連接到localhost的問題。 如果要連接到另一個服務,請使用其名稱:

postgres://admin:admin@database:5432/postgresdb

jabbsons answer解決了這兩個問題,此外,在lowwercase中創建表也解決了查詢問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM