我有带有dockercompose.yml的项目文件夹“ Myproject”,以及其中的Django_with_httpd和context的上下文构建文件夹。
在构建上下文文件夹中放置了我的Django应用代码。
我正在使用COPY将代码放入容器中。
我也将一些初始数据放入了我的postgresql数据库中,该数据库位于dockercompose期间创建的docker卷中。
一旦一切正常,我计划将整个文件夹以及docker卷复制到生产服务器上进行分期。
直到最终生产:
因此,数据库中make的任何更改都想将卷复制回产品服务器。
我还要在“ Myproject”中进行的任何更改都希望将整个文件夹复制到生产环境中。
那是完成事情的方式吗?
使“ Myproject”文件夹与开发主机上的文件夹保持同步的最佳方法是什么。我应该使用git吗?
答案 0 :(得分:1)
您的第一步应该是确保事物在完全干净的环境中运行。针对完全空的数据库在本地运行您的应用程序。 (Docker是运行数据库的一种好方法;这是进行开发的一种困难的方法。)您的应用程序应该能够在这种环境下启动并成功运行。
您可能需要编写迁移或数据库固件代码来加载初始数据集。既然您说在所有环境中都需要相同的基础数据集,那么将其签入源代码树是很有意义的。
现在在Docker领域中,您需要一个脚本,该脚本将在适当的情况下运行迁移,然后启动服务器。如果您使用的是Django,则可能类似于:
#!/bin/sh
python manage.py migrate
exec python manage.py runserver 0.0.0.0:8000
在您的Dockerfile COPY
中,将该脚本写入映像并使其成为您的CMD
。典型的Dockerfile可能如下所示:
FROM python:3.7
WORKDIR /app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . ./
CMD ["./run.sh"]
现在,您可以使用正确的数据库设置在任何环境中运行该映像,并且迁移系统会自动创建基本数据(如果尚不存在)。
使用此设置,您将在开发,测试和生产环境中运行完全相同的代码。不要尝试将本地应用程序代码注入到开发模式容器中;这不仅比在本地运行代码(也许在Python虚拟环境中)运行更困难,而且与您将在生产环境中使用的代码根本不同。
使“ Myproject”文件夹与开发主机上的文件夹保持同步的最佳方法是什么。我应该使用git吗?
源代码控制系统非常重要。 Git非常受欢迎,但是还有许多其他选项更符合人体工程学,不鼓励使用某些潜在的危险路径。
您永远不应在“ myproject”文件夹周围进行复制。运行docker build
从Dockerfile生成映像,然后docker push
到某个注册表。您可能需要研究一个持续集成(CI)系统,该系统可以在将更改推送到存储库时自动构建并推送映像。如果这仅是您需要CI系统来完成的工作,则Docker Hub的自动构建将可以正常工作,但您通常还可以将其配置为在实际构建发生之前运行测试,这至少需要一些操作更有力。
(这种情况的例外是,如果您有一些与部署相关的文件,例如docker-compose.yml
文件,其中,源代码管理系统是保存和分发它们的最佳方法。在这种情况下,您可能需要还可以在生产环境中检出源存储库。对于像这样的单个文件,scp
也可以正常工作。)