如何在Docker镜像中安装带有所有依赖项的Python包?

20

我正在使用Docker容器中的jupyter/pyspark-notebookUbuntu 15.10上工作。我需要安装folium及其所有依赖项,并在容器中运行Pyspark脚本。我成功安装了Docker,拉取了镜像并使用以下命令运行:

docker run -d -p 8888:8888 -p 4040:4040 -v /home/$MYUSER/$MYPROJECT:/home/jovyan/work jupyter/pyspark-notebook

然后,我成功地执行了这段代码示例

import pyspark
sc = pyspark.SparkContext('local[*]')

# do something to prove it works
rdd = sc.parallelize(range(1000))
rdd.takeSample(False, 5)

我在/opt文件夹中查找conda环境(如文档所述),但是没有找到conda。然后,我像普通Python包一样安装了miniconda3和folium及其所有依赖项(不涉及Docker)。
但是它无法正常工作。当我运行图像并尝试使用import folium导入包时,它找不到folium包。
ImportErrorTraceback (most recent call last)
<ipython-input-1-af6e4f19ef00> in <module>()
----> 1 import folium

ImportError: No module named 'folium'

因此,问题可以简化为两个问题:

  1. 容器的conda在哪里?
  2. 我该如何将需要的Python包安装到容器中?

2
要将Python包安装到Docker容器中,您可以创建一个新的Dockerfile FROM jupyter/pyspark-notebook 并添加 conda install --quiet --yes 'folium',或者只需登录到容器中 sudo docker exec -it container_id /bin/bash 并直接在容器内安装(首选使用第一种方法)。 - Xiongbing Jin
一个Docker容器是隔离的,它看不到你机器上安装的任何东西。你需要一个Dockerfile,在其中声明安装folium的命令,就像warmoverflow评论中提到的那样。不要使用第二种方法,当重新启动时,容器会恢复到初始状态,你会丢失在运行容器内直接进行的任何更改。 - Shanoor
感谢warmoverflowShanShan的评论!我之前并没有理解容器有自己的文件系统。我执行了 $ docker my_containers_name ls /opt/conda,发现了conda环境。 - Jocer
1个回答

15
要回答第一个问题:“conda环境在哪里?” 我们只需要在控制台中执行以下命令 $ docker my_containers_name ls /opt/conda
第二个问题有两个选项:
  • We can open the containers console by executing the command

    $ docker exec -it my_containers_name /bin/bash

    and install the package like a normal conda package

    conda install --channel https://conda.anaconda.org/conda-forge folium

  • We can modify the Dockerfile of the Docker image or create a new one extending the previous one. To create a new Dockerfile and add the lines

    FROM jupyter/minimal-notebook
    USER jovyan
    RUN conda install --quiet --yes --channel https://conda.anaconda.org/conda-forge folium && conda clean -tipsy
    

    And build our new image. If we want to modify the original Dockerfile we must skip the first line.

我通过复制原始项目,创建了自己的Dockerfile
感谢warmoverflowShanShan对我的评论。

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