在我的docker镜像中,我正在克隆git master分支以检索代码。我正在使用docker-compose进行开发环境并使用卷运行我的容器。我从python requirements.txt文件安装新的项目需求时遇到了一个问题。在开发环境中,它永远不会在开发环境中安装新的需求,因为在重新构建映像时,最新的代码是从github中提取的。
以下是我的dockerfile示例:
FROM base
# Clone application
RUN git clone repo-url
# Install application requirements
RUN pip3 install -r app/requirements.txt
# ....
这是我的撰写文件:
myapp:
image: development
env_file: .env
ports:
- "8000:80"
volumes:
- .:/home/app
command: python3 manage.py runserver 0.0.0.0:8000
有没有办法在构建开发后安装新添加的需求?
答案 0 :(得分:2)
有两种方法可以做到这一点。
您可以输入容器并自行完成。缺点:不是自动化的。
$ docker-compose exec myapp bash
2912d2cd9eab# pip3 install -r /home/app/requirements.txt
您可以使用运行准备工作的入口点脚本,然后运行命令。
<强> Dockerfile:强>
COPY entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh
# ... probably other stuff in here ...
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
ENTRYPOINT ["/entrypoint.sh"]
<强> entrypoint.sh:强>
#!/bin/sh
cd /home/app
pip3 install -r requirements.txt
# May as well do this too, while we're here.
python3 manage.py migrate
exec "$@"
在容器启动时,入口点就像这样运行:
/entrypoint.sh $CMD
扩展为:
/entrypoint.sh python3 manage.py runserver 0.0.0.0:8000
首先运行准备工作,然后在入口点脚本的末尾,执行传入的参数。这是你的命令,所以entrypoint.sh退出并被你的Django应用服务器取代。
<强>更新强>
在评论聊天之后,我们发现使用exec
运行命令非常重要,而不是在入口点脚本的末尾运行它,如下所示:
python3 manage.py runserver 0.0.0.0:8000
我不能完全回想起为什么这很重要,但我之前也遇到了这个问题。你需要执行命令,否则它将无法正常工作。
答案 1 :(得分:1)
我解决此问题的方法是运行两个服务:
这是docker-compose.yml文件的样子:
version: '3'
services:
django:
image: python:3.7-alpine
volumes:
- pip37:/usr/local/lib/python3.7/site-packages
- .:/project
ports:
- 8000:8000
working_dir: /project
command: python manage.py runserver
depends_on:
- requirements
requirements:
image: python:3.7-alpine
volumes:
- pip37:/usr/local/lib/python3.7/site-packages
- .:/project
working_dir: /project
command: pip install -r requirements.txt
volumes:
pip37:
external: true
PS:我为pip模块创建了一个命名卷,以便可以在不同项目中保留它们。您可以通过运行以下命令自己创建一个:
docker volume create mypipivolume