我对Docker相对较新,但我非常喜欢它的设计方式。 我即将改变我们的项目发布工作流程,我有一些问题,我希望有些人可以分享一些经验,了解最佳方法。
我们使用Vagrant来管理开发环境。我们为项目使用基于PHP的框架。我的目标是尽可能地模仿开发人员机器上的实时环境。
据我试过Docker。一旦测试完成,我可以使用CI来创建最终容器,在发布之前推送到我们自己的Docker Hub,服务器可以只获取容器的新版本,我们可以做无痛的发布。这部分对我来说非常清楚。这样,给定版本的源代码就会被烘焙到容器中。
虽然我的问题是我不希望开发人员在开发项目时提交Docker镜像。我希望他们使用Git并使用Vagrant和Docker在本地构建环境。
在这种情况下,我必须将项目源代码作为卷(不是容器的一部分),以确保开发人员可以看到实时编辑,调试等。
有没有简单的方法来实现这一目标?我是否需要使用2个Docker文件 一个用于开发环境的Docker文件和一个用于实时发布的Docker文件,其中区别在于源代码的管理方式?
任何想法或反馈都表示赞赏。对我来说,关键的挑战是拥有一个开发环境,其中源代码编辑和调试非常简单,同时我可以创建一个包含来自我的CI的可交付软件的所有内容的最终容器图像。
提前感谢任何人。
答案 0 :(得分:0)
我一直在使用不同的脚本和文件系统标志来达到类似的效果。
不同的脚本:当您启动Docker容器时,可以传递命令来运行。该命令可能是与您希望容器执行的角色对应的bash脚本的名称。例如,要在开发角色中启动它,您可以使用
docker run -t -i $tag /etc/rc.dev
虽然release角色只是默认值(它是用CMD指定的脚本):
docker run -t -i $tag
文件系统标志:您可以通过将标志文件放在使用VOLUME装入的外部文件夹中来控制容器的启动和行为方式。例如,我的发布主机有一个外部SMTP服务器,但是当容器用于开发时,它必须启动它自己的SMTP服务器。为此,我在外部文件系统中放置一个标志“/ var / your_project / flags / start_postfix”,容器的启动脚本按如下方式检查此标志:
if [ -e /var/your_project/flags/start_postfix ]; then
/etc/init.d/rsyslog start
/etc/init.d/postfix start
fi
那你怎么用这些呢?
一种选择是在开发人员主机上的VOLUME挂载文件夹中包含SSH密钥和其他类型的开发人员凭据。然后,容器启动脚本将检测SSH密钥的存在并切换到开发角色,在该角色中,它将使用密钥从Git中提取项目的新版本。