在Dockerfile中成功创建了virtualenv(使用“mkproject”),但无法正常运行“workon”

时间:2017-10-10 15:31:55

标签: docker virtualenv virtualenvwrapper

编辑:解决错误

我有一个Dockerfile,它使用virtualenvwrapper成功创建了一个virtualenv(以及在我们的正常环境中设置一堆“标准”设置/包)。我使用生成的图像作为“基本图像”以供进一步使用。到目前为止都很好。但是,以下Dockerfile(基于第一个图像“base_image_14.04”)落在最后一行:

FROM base_image_14.04

USER root
RUN DEBIAN_FRONTEND=noninteractive \
    apt-get update && apt-get install -y \
    libproj0 libproj-dev \
    libgeos-c1v5 libgeos-dev \
    libjpeg62 libjpeg-dev \
    zlib1g zlib1g-dev \
    libfreetype6 libfreetype6-dev \
    libgdal20 libgdal-dev \
    && rm -rf /var/lib/apt/lists

USER webdev
RUN ["/bin/bash", "-ic", "mkproject maproxy"]

EXPOSE 80
WORKDIR $PROJECT_HOME/mapproxy
ADD ./requirements.txt .

RUN ["/bin/bash", "-ic", "workon mapproxy &&  pip install -r requirements.txt"]

“mkproject mapproxy”工作正常。如果我注释掉它成功构建的最后一行,我可以旋转容器并手动运行“workon mapproxy”,而不是问题。但是当我尝试使用最后一行构建时,它会产生一个错误:

ERROR: Environment 'mapproxy' does not exist. Create it with 'mkvirtualenv mapproxy'.
正在调用workon,但由于某种原因,它无法找到mapproxy virtualenv。

WORKON_HOME& PROJECT_HOME都存在(在父图像中定义)并指向正确的位置(并由“mkproject mapproxy”成功使用)。

那么,当mapproxy virtualenv存在时,为什么workon会返回错误?当我将最后一行隔离到第二行的第三个Dockerfile构建时,会发生同样的错误。

2 个答案:

答案 0 :(得分:0)

解决:这是一个简单的错字。 mkproject maproxy而不是mapproxy。 :叹息:

答案 1 :(得分:0)

我正在尝试构建一个docker镜像,并遇到类似的问题。

第一个问题是为什么在docker中使用虚拟环境?简而言之,主要原因是尽量减少将现有和工作方法迁移到docker容器的工作量。我最终将使用docker-compose,但我想首先在一个Docker容器中弄湿我的脚。

在我的第一次尝试中,我使用apt-get安装了几乎所有内容,包括uwsgi。我用pip3“全局”安装了我的应用程序。该应用程序具有命令行功能和一个单独的烧瓶Web应用程序,因此需要uwsgi。命令行功能有效,但是当我向烧瓶app发出请求时,uwsgi / python的语言环境有问题:Fatal Python error: Py_Initialize: Unable to get the locale encoding and ImportError: No module named 'encodings

我已经删除了我的所有应用程序特定添加内容以缩小问题范围。这是我正在使用的Dockerfile:

# Docker image definition for testing
FROM ubuntu:xenial

# Create a user 
RUN useradd -G sudo -ms /bin/bash tester
RUN echo 'tester:password' | chpasswd
WORKDIR /home/tester   

# Skipping apt-get update to save some build time. Some are kept
# to insure they are the same as on host setup.
RUN apt-get install -y python3 python3-dev python3-pip \
    virtualenv virtualenvwrapper sudo nano && \
    apt-get clean -qy

# After above, can we use those installed in rest of Dockerfile?
# Yes, but not always, such as with virtualenvwrapper. What about
# virtualenv? How do you "source" the script? Doesn't appear to be
# installed, as bash complains "source needs a single parameter"
ENV VIRTUALENVWRAPPER_PYTHON /usr/bin/python3
ENV VIRTUALENVWRAPPER_VIRTUALENV /usr/bin/virtualenv
RUN ["/bin/bash", "-c", "source", "/usr/share/virtualenvwrapper/virtualenvwrapper.sh"]

# Create a virtualenv so uwsgi can find locale
# RUN mkdir /home/tester/.virtualenv && virtualenv -p`which python3` /home/bts_tools/.virtualenv/bts_tools
RUN mkvirtualenv -p`which python3` bts_tools && \
    workon bts_tools && \
    pip3 --disable-pip-version-check install --upgrade bts_tools 

USER tester
ENTRYPOINT ["/bin/bash"]
CMD ["--login"]

在我试图获取virtualenvwrapper脚本的行上构建失败。 Bash抱怨源需要一个参数 - 要获取的文件。所以我注释掉了RUN行,它构建没有错误。当我运行生成的容器时,我看到了virtualenvwrapper所做的ENV的所有添加(您可以通过执行“set”命令而不使用任何args来查看所有这些),并且要获取的脚本也在那里。

所以我的问题是为什么码头工人找不到它们?如果任何先前的RUN或ENV的结果未应用于Dockerfile中的后续使用,docker构建过程如何工作?我知道有些东西是应用和工作的,例如,如果你apt-get nginx可以引用/ etc / nginx或改变该文件夹下的东西。例如,您可以创建用户并将其密码或cd设置到其主文件夹中。如果我在RUN useradd -G之前移动WORKDIR,我看到来自useradd的警告,则主文件夹已经存在。我尝试使用“时间”程序计算在Dockerfile中执行各种操作需要多长时间,并且docker抱怨它无法找到“时间”。

那到底是怎么回事?我花了最近3天试图解决这个问题。这不应该是这么困难。我错过了什么?

当我没有使用虚拟环境时,部分bts_tools烧瓶应用程序正常工作。大多数应用程序都不起作用,问题是这个区域设置问题。由于一切都在docker之外的主机上运行,​​并且在我的uwsgi启动脚本中尝试改变PATH,PYTHONHOME,PYTHONPATH以克服可怕的“locale编码”致命错误之后,我决定尝试尽可能地复制主机设置因为那没有区域设置问题。当我遇到问题之前我可以运行dpkg-reconfigure python3或者修改PATH或ENV设置。如果你谷歌问题,你会发现很多人都有python和amp;语言环境。这几乎是避免使用python的理由!

我在其他地方发布了this有关语言环境问题的信息,如果有帮助的话。