将 django 项目转移到另一台机器
Transfer a django project to another machine
这是一个初学者问题,但我还没有找到答案。我想将我的 django 项目从 Ubuntu 18.04 的虚拟机转移到另一个 Ubuntu 18.04.
的虚拟机
这是示例目录结构
pd_videowebapp/
├── db.sqlite3
├── env
│ ├── bin
│ ├── lib
│ └── pyvenv.cfg
├── manage.py
├── media
│ ├── images
│ └── video
├── mysite
│ ├── core
│ ├── __init__.py
│ ├── __pycache__
│ ├── settings.py
│ ├── static
│ ├── templates
│ ├── urls.py
│ └── wsgi.py
├── Pipfile
├── requirements.txt
└── static
├── admin
├── style2.css
└── style3.css
在 env
目录中有一个 Python 虚拟环境。
在我转移之前我会运行
$ pip freeze > requirements.txt
然后我将压缩除 db.sqlite3
和 media
目录之外的所有目录结构。
然后在另一个虚拟机上解压。
然后将db.sqlite3
和media
目录复制到正确的位置。
然后在另一个虚拟机上创建一个虚拟环境。
然后运行
$ pip install -r requirements.txt
或者我应该在开头复制整个项目 env
目录?什么是更好的?我遗漏了什么吗?或者有更好的方法吗?
Or should I rather copy the whole project with env
directory in the beginning? What is better? Did I omit something? Or is there a better approach?
最好不要复制env
目录。排除此目录。
有很多方法可以做到这一点。我建议你使用 Git
。为此:
- 从当前项目创建一个 git 存储库
- 使用正确的
.gitignore
文件忽略 env
目录和其他 environment-related 内容:
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Other stuff
- 从其他 VM 克隆项目并在此 VM 中配置虚拟环境
更简单的方法:
压缩整个项目,同时排除 env
目录和其他
手动忽略的东西。
将 zip 文件移动到其他 VM 并在此 VM 中配置虚拟环境
你的想法是正确的。您可以在没有 env
目录的情况下压缩项目。
在新系统中创建虚拟环境:假设您已经根据需要安装了python3-pip
、python3-dev
等,然后在您的新系统中设置项目,方法是从终端项目目录并执行这些命令(如您所知)-
# install virtual env
pip install virtualenv
# create virtual env
virtualenv -p /usr/bin/python3 venv
# activate virtual env
source venv/bin/activate
# install project dependencies
pip install -r requirements.txt
那你就没事了。此外,您可以创建一个远程存储库(例如在 Github 上)并通过 .gitignore 文件忽略虚拟环境目录 env
]
如果您正在寻找不需要重新配置新系统的解决方案,我强烈建议您使用 Docker
您可以使用 docker 进行更简单的传输
你可以使用下面的 Dockerfile:
# syntax=docker/dockerfile:1
FROM python:3.9
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /code
RUN pip install --upgrade pip
COPY requirements.txt /code/
RUN pip install -r requirements.txt
#COPY daemon.json /etc/docker/daemon.json
COPY . /code/
EXPOSE 80
您可以在此处找到有关 dockerizing django 应用程序的更多信息 https://docs.docker.com/samples/django/
希望对您有所帮助!
每个答案都有一个其他答案所缺少的元素。我会尝试将所有这些汇总成一个可行且合理的计划。
不要复制虚拟环境目录
Python 虚拟环境目录已优化为使用链接而不是副本,因此如果您在单台计算机上创建类似的虚拟环境,则不会因相同 pip 的副本而使磁盘膨胀包和 Python 个文件。
复制环境会破坏此模型。它可能不起作用或行为不端。
使用git和.git忽略指定易变资源
如果您使用 git 管理您的项目,您绝对应该有一个 .gitignore
来说明哪些资源是 auto-generated、user-specific、volatile 等,并且应该不是共享仓库的一部分。
在继续下一步之前,您应该按照@hamraa 的建议进行设置。
使用git重新定位项目
假设你在两台机器上都有互联网连接,为什么你必须压缩并移动它?
如果两台机器都可以访问同一台 Git 服务器,您应该将您的更改推送到全局存储库,然后从其他 VM 中拉取这些更改。
如果不是这种情况,但目标 VM 与源计算机有 SSH 连接,您可以调用:
git clone ssh://<username>@<hostname>:/<path-to-repo>
使用 git-bundle 从您的存储库创建一个可移动的包
如果机器之间没有网络连接,您可以使用一个很酷的 Git 功能,使用单个文件轻松移动存储库。
命令很简单:
git bundle create app.bundle <commit/tag/branch>
然后您可以将这个包移动到任何其他机器并使用:
git clone app.bundle
考虑使用Docker
我不反对Docker,我爱Docker。但是(!)我不认为 有 是解决方案。使用好的 bring-up 脚本,您可以拥有一个非常易于使用的 Git 存储库,您可以快速轻松地设置它。很少有只有一种正确方法的情况。我认为这不是其中之一。
由于您要从一个 VM 转移到另一个,假设您在 AWS 上,您可以使用 AMI
创建当前实例 (VM) 的快照,然后启动一个新实例 (VM)已保存 AMI
。这样做的好处是它将保留您当前的所有设置、代码库和数据。您不必从头开始配置新机器。
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html
这是一个初学者问题,但我还没有找到答案。我想将我的 django 项目从 Ubuntu 18.04 的虚拟机转移到另一个 Ubuntu 18.04.
的虚拟机这是示例目录结构
pd_videowebapp/
├── db.sqlite3
├── env
│ ├── bin
│ ├── lib
│ └── pyvenv.cfg
├── manage.py
├── media
│ ├── images
│ └── video
├── mysite
│ ├── core
│ ├── __init__.py
│ ├── __pycache__
│ ├── settings.py
│ ├── static
│ ├── templates
│ ├── urls.py
│ └── wsgi.py
├── Pipfile
├── requirements.txt
└── static
├── admin
├── style2.css
└── style3.css
在 env
目录中有一个 Python 虚拟环境。
在我转移之前我会运行
$ pip freeze > requirements.txt
然后我将压缩除 db.sqlite3
和 media
目录之外的所有目录结构。
然后在另一个虚拟机上解压。
然后将db.sqlite3
和media
目录复制到正确的位置。
然后在另一个虚拟机上创建一个虚拟环境。
然后运行
$ pip install -r requirements.txt
或者我应该在开头复制整个项目 env
目录?什么是更好的?我遗漏了什么吗?或者有更好的方法吗?
Or should I rather copy the whole project with
env
directory in the beginning? What is better? Did I omit something? Or is there a better approach?
最好不要复制env
目录。排除此目录。
有很多方法可以做到这一点。我建议你使用 Git
。为此:
- 从当前项目创建一个 git 存储库
- 使用正确的
.gitignore
文件忽略env
目录和其他 environment-related 内容:
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Other stuff
- 从其他 VM 克隆项目并在此 VM 中配置虚拟环境
更简单的方法:
压缩整个项目,同时排除
env
目录和其他 手动忽略的东西。将 zip 文件移动到其他 VM 并在此 VM 中配置虚拟环境
你的想法是正确的。您可以在没有 env
目录的情况下压缩项目。
在新系统中创建虚拟环境:假设您已经根据需要安装了python3-pip
、python3-dev
等,然后在您的新系统中设置项目,方法是从终端项目目录并执行这些命令(如您所知)-
# install virtual env
pip install virtualenv
# create virtual env
virtualenv -p /usr/bin/python3 venv
# activate virtual env
source venv/bin/activate
# install project dependencies
pip install -r requirements.txt
那你就没事了。此外,您可以创建一个远程存储库(例如在 Github 上)并通过 .gitignore 文件忽略虚拟环境目录 env
]
如果您正在寻找不需要重新配置新系统的解决方案,我强烈建议您使用 Docker
您可以使用 docker 进行更简单的传输
你可以使用下面的 Dockerfile:
# syntax=docker/dockerfile:1
FROM python:3.9
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /code
RUN pip install --upgrade pip
COPY requirements.txt /code/
RUN pip install -r requirements.txt
#COPY daemon.json /etc/docker/daemon.json
COPY . /code/
EXPOSE 80
您可以在此处找到有关 dockerizing django 应用程序的更多信息 https://docs.docker.com/samples/django/
希望对您有所帮助!
每个答案都有一个其他答案所缺少的元素。我会尝试将所有这些汇总成一个可行且合理的计划。
不要复制虚拟环境目录
Python 虚拟环境目录已优化为使用链接而不是副本,因此如果您在单台计算机上创建类似的虚拟环境,则不会因相同 pip 的副本而使磁盘膨胀包和 Python 个文件。
复制环境会破坏此模型。它可能不起作用或行为不端。
使用git和.git忽略指定易变资源
如果您使用 git 管理您的项目,您绝对应该有一个 .gitignore
来说明哪些资源是 auto-generated、user-specific、volatile 等,并且应该不是共享仓库的一部分。
在继续下一步之前,您应该按照@hamraa 的建议进行设置。
使用git重新定位项目
假设你在两台机器上都有互联网连接,为什么你必须压缩并移动它?
如果两台机器都可以访问同一台 Git 服务器,您应该将您的更改推送到全局存储库,然后从其他 VM 中拉取这些更改。
如果不是这种情况,但目标 VM 与源计算机有 SSH 连接,您可以调用:
git clone ssh://<username>@<hostname>:/<path-to-repo>
使用 git-bundle 从您的存储库创建一个可移动的包
如果机器之间没有网络连接,您可以使用一个很酷的 Git 功能,使用单个文件轻松移动存储库。
命令很简单:
git bundle create app.bundle <commit/tag/branch>
然后您可以将这个包移动到任何其他机器并使用:
git clone app.bundle
考虑使用Docker
我不反对Docker,我爱Docker。但是(!)我不认为 有 是解决方案。使用好的 bring-up 脚本,您可以拥有一个非常易于使用的 Git 存储库,您可以快速轻松地设置它。很少有只有一种正确方法的情况。我认为这不是其中之一。
由于您要从一个 VM 转移到另一个,假设您在 AWS 上,您可以使用 AMI
创建当前实例 (VM) 的快照,然后启动一个新实例 (VM)已保存 AMI
。这样做的好处是它将保留您当前的所有设置、代码库和数据。您不必从头开始配置新机器。
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html