docker-compose忽略已安装的django,virtualenv

问题描述 投票:0回答:1

docker-compose忽略已安装的虚拟环境

我正在尝试对现有的django应用进行docker化。我也是Docker的新手,所以请原谅我,如果这是某种“只是阅读说明”的事情。问题51490937似乎有些相关,但是我不确定。我的应用程序通过pip install mod-wsgi运行apache,并且已经很好地部署到本地ubuntu 18和19虚拟机。我运行win10,正在使用Docker版本为19.03.4的linux容器,构建9013bf5,然后运行python:3.7基本映像。

我的问题:使用docker-compose up时运行安装的映像失败,但是当我手动运行相同的映像时成功运行。我首先假设我有一个缓存问题,但是尝试按https://forums.docker.com/t/how-to-delete-cache/5753的建议进行所有操作均无济于事。另外,我的本地项目文件夹的时间戳与手动运行的容器的时间戳和Dockerfile返回的时间戳相同。所以现在我假设我的docker-compose.yml出了点问题,或者我激活了一些我不知道的分支。 (文件附在末尾)为了进行调试,我删除了postgress服务,现在运行默认的sqlite数据库。

docker-compose up(ls -la && source venv / bin / activate)返回:

some other files...
302_game_container | -rwxr-xr-x 1 root root   400 Nov 11 16:49 test.py
302_game_container | drwxrwxrwx 2 root root     0 Nov 12 11:55 web_project
302_game_container | bash: venv/bin/activate: No such file or directory <---- The ERROR
302_game_container exited with code 1

注意:此处显示的时间戳是(11:55 web_project),并且缺少venv文件夹。看来venv没有正确安装。

但是,当我现在通过输入手动运行同一图像时:

docker run -it -d 302_chess_game_2019_11_12_15_20_33_354574

docker exec -it myDockerContainer bash

ls -la &&源venv / bin / activate

我得到理想的结果:

some other files...
-rwxr-xr-x 1 root root       400 Nov 11 16:49 test.py
drwxr-xr-x 5 root root      4096 Nov 12 11:57 venv
drwxrwxrwx 1 root www-data  4096 Nov 12 11:59 web_project
(venv) root@d98fde4a6316:/302_chess_game#

然后,我可以成功运行python web_project / manage.py runserver,甚至重新启动sudo / etc / wsgi-port-8000 / apachectl。因此,该映像包含已安装的venv。然后,我可以在0.0.0.0:8000下查看页面。

我的设置:Dockerfile运行一个script.sh,该脚本安装所有产品程序,创建我的venv,安装requirements.txt,激活venv,然后运行makemakemigrations,迁移和collectstatic。所有任务均成功运行。最后一步Dockerfile运行ls -la返回:

some other files...
-rwxr-xr-x 1 root root       400 Nov 11 16:49 test.py
drwxr-xr-x 5 root root      4096 Nov 12 11:57 venv
drwxrwxrwx 1 root www-data  4096 Nov 12 11:59 web_project

您可以看到,venv安装在映像中,并且web_project文件夹的时间戳为(11:59 web_project)。

这是我减少的docker-compose.yml(project = 302_chess_game,timeStamp = _2019_11_12_15_20_33_354574,port = 8000,image = python:3.7)

version: '3'
services:
    python:
        image: {{ project }}{{ timeStamp }}
        container_name: 302_game_container
        volumes:
            - .:/{{ project }}
        ports:
            - {{ port }}:{{ port }}
        command: >
            bash -c "ls -la && source venv/bin/activate"

这是我的Dockerfile

FROM {{ image }}

# install ubuntu stuff
RUN apt -y update
RUN apt -y upgrade
RUN apt-get -y install sudo

# copy files
RUN sudo mkdir /{{ project }}
WORKDIR /{{ project }}
COPY . /{{ project }}/

# set default evn variables
ENV PYTHONUNBUFFERED 1
ENV LANG C.UTF-8
#ENV DEBIAN_FRONTEND=noninteractive

# set environment variables
ENV PORT={{ port }}
ENV PRODUCTION=1
ENV SERVER={{ server }}
ENV DEBUG={{ debug }}
ENV DATABASE={{ database }}

# install shell script
RUN chmod 777 ./resources/{{ install_sh }}
RUN sed -i -e 's/\r$//' ./resources/{{ install_sh }}
RUN ./resources/{{ install_sh }}
RUN ls -la

EXPOSE {{ port }}
# add user implemented later
#RUN useradd -ms /bin/bash {{ username }}
#RUN echo '{{ username }}:test321' | chpasswd
#RUN adduser {{ username }} sudo
#RUN chown -R {{ username }}:sudo /{{ project }}
#USER {{ username }}

这是shell脚本:

#!/bin/bash
sudo apt install vim -y
sudo apt install net-tools
sudo apt install -y python3-pip
sudo apt install build-essential libssl-dev libffi-dev python3-dev -y
sudo apt install apache2 -y
sudo apt install apache2-dev -y
sudo apt install -y python3-venv
pip3 install mod_wsgi
python3 -m venv venv
source venv/bin/activate
python -m pip install --upgrade pip
pip install --upgrade setuptools
pip install -r requirements.txt
pip install mod_wsgi
sudo mkdir /etc/wsgi-port-{{ port }}
sudo chown -R {{ username }}:{{ username }} /etc/wsgi-port-{{ port }}
sudo groupadd  www-data
sudo adduser  www-data  www-data
sudo chown -R :www-data web_project/media/
sudo chmod -R 775 web_project/media/
sudo chown -R :www-data web_project
sudo chmod 777 web_project
sudo chown :www-data web_project/{{ project }}.sqlite3
sudo chmod 664 web_project/{{ project }}.sqlite3
python web_project/manage.py makemigrations
python web_project/manage.py migrate
python web_project/manage.py collectstatic
python web_project/manage.py runmodwsgi --server-root /etc/wsgi-port-{{ port }} --user www-data --group www-data --port {{ port }} --url-alias /static static --url-alias /media media --setup-only
#
# sudo cp conf_files/sshd_config /etc/ssh/sshd_config
# sudo systemctl restart sshd
# sudo apt install ufw -y
# sudo ufw default allow outgoing
# sudo ufw default deny incoming
# sudo ufw allow ssh
# sudo ufw allow http/tcp
# sudo ufw allow https/tcp
# sudo ufw allow 3389
# sudo ufw enable
# sudo passwd {{ username }}
# netstat -nat | grep LISTEN
# sudo ufw status
# sudo /etc/wsgi-port-{{ port }}/apachectl restart
# sudo apt install xrdp
# sudo apt remove lightdm
# sudo apt install xfce4
# sudo apt-get install xfce4-terminal tango-icon-theme
# echo xfce4-session > ~/.xsession
# sudo apt install libexo-1-0
# sudo apt install firefox
# sudo service xrdp restart
# sudo /etc/wsgi-port-{{ port }}/apachectl restart

要重现,请运行以下docker-compose.yml:

version: '3'
services:
    python:
        image: lmielke/302_chess_game_2019_11_12_15_49_04_892687:testcontainer
        container_name: 302_game_container
        volumes:
            - .:/302_chess_game
        ports:
            - 8000:8000
        command: >
            bash -c "source venv/bin/activate && 
            sudo apachectl stop && 
            sudo /etc/wsgi-port-8000/apachectl start"

这将拉出映像,但是容器构建将如所述失败。然后运行:泊坞窗运行-it -d(imgId),docker exec -it(containerId),来源venv / bin / activate,sudo / etc / wsgi-port-8000 / apachectl启动,它将显示一些别名警告,但运行正常。您可以将ls -la添加到bash cmds中,以查看没有venv文件夹。

python django docker docker-compose mod-wsgi
1个回答
0
投票

好吧,所以最终还是没有脑子。我打算在我的图像项目文件夹中激活venv,这在我事先将本地文件夹安装在docker-compose中时具有挑战性。

© www.soinside.com 2019 - 2024. All rights reserved.