如何在我的 docker 镜像中安装 postgresql?

Posted

技术标签:

【中文标题】如何在我的 docker 镜像中安装 postgresql?【英文标题】:How to install postgresql in my docker image? 【发布时间】:2018-12-25 11:26:54 【问题描述】:

我正在尝试在我的 spark 应用程序中从 Postgresql 获取数据。但现在我很困惑如何在我的 docker 映像中安装 postgresql 驱动程序。我还尝试将 postgresql 安装为 apt-get install 命令,如下所述(Dockerfile)。

Dockerfile:

FROM python:3


ENV SPARK_VERSION 2.3.2
ENV SPARK_HADOOP_PROFILE 2.7
ENV SPARK_SRC_URL https://www.apache.org/dist/spark/spark-$SPARK_VERSION/spark-$SPARK_VERSION- 
bin-hadoop$SPARK_HADOOP_PROFILE.tgz
ENV SPARK_HOME=/opt/spark
ENV PATH $PATH:$SPARK_HOME/bin

RUN wget $SPARK_SRC_URL
RUN tar -xzf spark-$SPARK_VERSION-bin-hadoop$SPARK_HADOOP_PROFILE.tgz

RUN mv spark-$SPARK_VERSION-bin-hadoop$SPARK_HADOOP_PROFILE /opt/spark
RUN rm -f spark-$SPARK_VERSION-bin-hadoop$SPARK_HADOOP_PROFILE.tgz
RUN apt-get update && \
apt-get install -y openjdk-8-jdk-headless \
 postgresql && \
rm -rf /var/lib/apt/lists/*
ENV JAVA_HOME  /usr/lib/jvm/java-8-openjdk-amd64/

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt


COPY my_script.py ./
CMD [ "python", "./my_script.py" ]

requirements.txt: pyspark==2.3.2 麻木的

我的脚本.py:

from pyspark import SparkContext
from pyspark import SparkConf

#spark conf
conf1 = SparkConf()
conf1.setMaster("local[*]")
conf1.setAppName('hamza')
print(conf1)
sc = SparkContext(conf = conf1)
print('hahahha')

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
print(sqlContext)

from pyspark.sql import DataFrameReader
url = 'postgresql://IP:PORT/INSTANCE'
properties = 'user': 'user', 'password': 'pass'
df = DataFrameReader(sqlContext).jdbc(
url='jdbc:%s' % url, table=query, properties=properties
)

收到此错误:

Traceback (most recent call last):
  File "./my_script.py", line 26, in <module>
, properties=properties
  File "/usr/local/lib/python3.7/site-packages/pyspark/sql/readwriter.py", line 527, in jdbc
  return self._df(self._jreader.jdbc(url, table, jprop))
  File "/usr/local/lib/python3.7/site-packages/py4j/java_gateway.py", line 1257, in __call__
answer, self.gateway_client, self.target_id, self.name)
  File "/usr/local/lib/python3.7/site-packages/pyspark/sql/utils.py", line 63, in deco
return f(*a, **kw)
  File "/usr/local/lib/python3.7/site-packages/py4j/protocol.py", line 328, in get_return_value
format(target_id, ".", name), value)
       py4j.protocol.Py4JJavaError: An error occurred while calling o28.jdbc.
   : java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:315)

请指导我如何设置此驱动程序 谢谢

【问题讨论】:

觉得还是需要安装postgresql jdbc驱动。 Spark Unable to find JDBC Driver的可能重复 【参考方案1】:

这不是Docker 的做事方式。 Docker 方法不是将所有服务都放在一个容器中,而是将它们拆分为多个,每个容器应该有一个主进程,如数据库、应用程序等。

此外,当使用单独的容器时,您不必关心在 Dockerfile 中安装所有必要的东西 - 您只需选择具有所需数据库类型的现成容器即可。顺便说一句,如果你使用python:3 docker 镜像,你怎么知道,维护者不会更改已安装的服务集,甚至不会更改操作系统类型?他们可以很容易地做到这一点,因为他们只提供“Python”服务,其他一切都没有定义。

所以,我推荐的是:

    将您的项目拆分到不同的容器中 (Dockerfiles) 为您的数据库使用标准的 postgres 图像 - 所有服务和驱动程序都已载入 使用docker-compose(或其他)启动两个容器并将它们链接到一个网络中。

【讨论】:

好吧听起来不错但是如果我想在这个 docker 中添加 postgresql 驱动程序我该怎么做呢? 如果你还想要多合一的 docker,添加 postgres 驱动,而不仅仅是数据库本身。这是解决方案:***.com/questions/34948296/…【参考方案2】:

在 Dockerfile 中添加这些行解决了这个问题:

ENV POST_URL https://jdbc.postgresql.org/download/postgresql-42.2.5.jar
RUN wget $POST_URL
RUN mv postgresql-42.2.5.jar /opt/spark/jars

谢谢大家

【讨论】:

以上是关于如何在我的 docker 镜像中安装 postgresql?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 ubuntu docker 映像中安装“ifconfig”命令? [复制]

docker安装postgres镜像&&如何通过Dockerfile使之在运行镜像时初始化数据

如何在 sles 12 中安装 docker?

如何在 Alpine linux docker 镜像中安装 oracle jdk11?

无法在基于 apache/zeppelin:0.9.0 的 Docker 映像中安装软件包

docker postgres 无法更改 pgdata 权限