如何在使用Docker容器搭建开发环境时管理开发任务?

1 投票
2 回答
1219 浏览
提问于 2025-04-21 09:02

我最近在研究Docker,基本上已经理解了我看到的内容。我已经构建了一些镜像,把容器连接在一起,挂载了数据卷,甚至还让一个示例的Django应用运行起来了。

不过,有一件事我始终搞不明白,那就是如何设置开发环境。Docker的主要目的是让你的环境可以随处使用,这样你做的每一件事都是可移植且一致的。比如说,如果我在生产环境中运行一个Django应用,并且是用gunicorn来提供服务,我需要重启服务器才能让我的代码更改生效;这在我本地的笔记本电脑上工作时就不太理想。如果我对模型或视图做了修改,我可不想每次都得进入容器,停止gunicorn,然后再重启它。

我也不太确定如何运行管理命令。比如说,python manage.py syncdb需要我进入容器内部运行命令。我还使用south来管理数据和架构的迁移,像是python manage.py migrate。其他人是怎么解决这个问题的呢?

调试也是个问题。我是不是得想办法把所有的日志保存到某个地方,以便我查看?我通常只是看Django开发服务器的输出,来查看错误和打印的信息。

看起来我得做一个特别的开发环境容器,里面有很多变通的方法;但这似乎完全违背了这个工具的初衷。有什么建议吗?

更新一下,经过更多的研究后:

感谢大家的回复,它们让我找到了正确的方向。

我最终发现了fig http://www.fig.sh/。它可以帮助你管理容器之间的链接和数据卷的挂载,你可以运行命令。比如说,fig run container_name python manage.py syncdb。这个工具看起来不错,我已经用它设置好了我的开发环境。

我还做了一个图,展示我是如何使用vagrant https://www.vagrantup.com/来设置的。 enter image description here

我只需在与我的fig.yml文件同一目录下运行

fig up

它就会完成链接容器和启动服务器所需的一切。在我使用Mac进行开发时,我只运行开发服务器,这样在我更改Python代码时,它会自动重启。

2 个回答

1

在我现在的工作中,我们设置了一个叫做django_admin的bash脚本。你可以这样运行它:

django_admin <management command>

举个例子:

django_admin syncdb

这个脚本大概长这样:

docker run -it --rm  \
-e PYTHONPATH=/var/local \
-e DJANGO_ENVIRON=LOCAL \
-e LC_ALL=en_US.UTF-8 \
-e LANG=en_US.UTF-8 \
-v /src/www/run:/var/log \
-v /src/www:/var/local \
--link mysql:db \
localhost:5000/www:dev /var/local/config/local/django-admin $@

我猜你也可以把类似的东西连接到manage.py上。

1

我通常会把实际的命令行(CMD)放在一个脚本里,这个脚本会启动一个bash(类Unix系统的命令行工具)环境。你可以看看这个Docker-Jetty的例子。在这个脚本的最后两行是:

/opt/jetty/bin/jetty.sh restart
bash

这段代码会启动jetty(一个Java的Web服务器),然后打开一个命令行窗口。

现在我可以用下面的命令进入这个容器里的命令行,运行任何命令或者查看日志。一旦我完成了,可以按Ctrl-p和Ctrl-q组合键来退出这个容器,而不关闭它。

docker attach CONTAINER_NAME

撰写回答