成功地在Dockerfile中创建了VirtualNV(使用“mkproject”),但可以';“t运行”;“工作”;适当地

成功地在Dockerfile中创建了VirtualNV(使用“mkproject”),但可以';“t运行”;“工作”;适当地,docker,virtualenv,virtualenvwrapper,Docker,Virtualenv,Virtualenvwrapper,编辑:已解决-键入错误 我有一个Dockerfile,它使用VirtualEnvrapper成功创建了一个VirtualEnvironment(同时在我们的正常环境中设置了一堆“标准”设置/包)。我将结果图像用作“基础图像”,以供进一步使用。到目前为止一切都很好。但是,以下Dockerfile(基于第一个图像“base_image_14.04”)位于最后一行: FROM base_image_14.04 USER root RUN DEBIAN_FRONTEND=noninteractive

编辑:已解决-键入错误

我有一个Dockerfile,它使用VirtualEnvrapper成功创建了一个VirtualEnvironment(同时在我们的正常环境中设置了一堆“标准”设置/包)。我将结果图像用作“基础图像”,以供进一步使用。到目前为止一切都很好。但是,以下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"]
“mkprojectmapproxy”工作正常。如果我注释掉它成功构建的最后一行,我就可以启动容器并手动运行“workon mapproxy”,这不是问题。但当我尝试使用最后一行构建时,它给出了一个workon错误:

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

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


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

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

解决了:这是一个简单的打字错误。mkproject maproxy而不是mapproxy.:叹气:

我正试图塑造一个码头工人的形象,却遇到了类似的问题

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

在我的第一次尝试中,我安装了几乎所有的apt-get,包括uwsgi。我用pip3“全球”安装了我的应用程序。该应用程序具有命令行功能和单独的flask web应用程序,因此需要uwsgi。命令行功能正常工作,但当我请求flask应用程序时,uwsgi/python存在区域设置问题:
致命python错误:Py_Initialize:无法获取区域设置编码和导入错误:没有名为“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"]
在我尝试获取VirtualNVRapper脚本源代码时,构建失败。Bash抱怨source需要一个参数—要源文件。因此,我注释掉了运行行,它构建时没有错误。当我运行生成的容器时,我会看到virtualenvwrapper对ENV所做的所有添加(您可以通过执行“set”命令而不使用任何参数来查看所有添加),并且要源代码的脚本也在那里

所以我的问题是为什么docker找不到他们?如果先前运行或环境的结果未应用于docker文件中的后续使用,docker构建过程如何工作?我知道有些东西已经应用并起作用了,例如,如果你
apt-get-nginx
,你可以参考/etc/nginx或修改该文件夹下的东西。例如,您可以创建一个用户并将其密码或cd设置到其主文件夹中。如果我在运行useradd-G之前移动WORKDIR,我会看到useradd发出的警告,主文件夹已经存在。我试图用“时间”程序来计算在Dockerfile中做各种事情需要多长时间,docker抱怨说它找不到“时间”

那么到底发生了什么?我花了三天的时间想弄明白这一点。这不应该这么难。我错过了什么

当我不使用虚拟环境时,bts_tools flask应用程序的某些部分工作正常。大多数应用程序都不工作,问题是这个区域设置问题。由于一切都在docker之外的主机上运行,并且在尝试更改uwsgi启动脚本中的路径、PYTHONHOME、PYTHONPATH以克服可怕的“区域设置编码”致命错误后,我决定尝试尽可能地复制主机设置,因为这不存在区域设置问题。当我在运行
dpkg重新配置python3
或修改路径或环境设置之前遇到这个问题时。如果你用谷歌搜索这个问题,你会发现很多人在python和locale方面有困难。这几乎是避免使用python的充分理由


我在别处发布了关于区域设置问题的帖子,如果有帮助的话。

我正在尝试建立一个docker映像,并且遇到了类似的问题

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

在我的第一次尝试中,我安装了几乎所有的apt-get,包括uwsgi。我用pip3“全球”安装了我的应用程序。该应用程序具有命令行功能和单独的flask web应用程序,因此需要uwsgi。命令行功能正常工作,但当我请求flask应用程序时,uwsgi/python存在区域设置问题:
致命python错误:Py_Initialize:无法获取区域设置编码和导入错误:没有名为“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"]
在我尝试获取VirtualNVRapper脚本源代码时,构建失败。Bash抱怨source需要一个参数—要源文件。因此,我注释掉了运行行,它构建时没有错误。当我运行生成的容器时,我会看到virtualenvwrapper对ENV所做的所有添加(您可以通过执行“set”命令而不使用任何参数来查看所有添加),并且要源代码的脚本也在那里

所以我的问题是为什么docker找不到他们?如果先前运行或环境的结果未应用于docker文件中的后续使用,docker构建过程如何工作?我认识索姆