![](/img/trans.png)
[英]Docker - PostgreSQL could not connect to server: Connection refused 127.0.0.1:5432
[英]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 很陌生,所以我確定我的配置有誤,任何幫助都會很棒。
配置
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:
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.