在面向对象编程(OOP)中,有设计模式(DP)。 DP是解决某些问题的最佳实践。例如,在记录器类中可以使用单例。

如何将DP应用于图像创建,例如码头工人在我们的情况下,我们拥有核心,即应用程序,应用程序配置(每个客户的自定义)和每个客户不同的工件。

目前,使用的bash脚本包含各种if-else语句越来越多的意大利面。

评论

这是一个非常有趣且具有挑战性的问题:您是否会分享几个(伪代码格式的)if-else段落来使内容更清楚?也就是说,似乎设计模式是一个高级考虑,但是当前的问题是意大利面条式bash代码。有什么功能块可以从中提取?

#1 楼

总体设计模式是一个容器=一个正在运行的服务-花费约一年后,请参阅https://docs.docker.com/config/containers/multi-service_container/开发一个严重依赖docker的多服务应用程序对我来说是有效的:

除非是您的存储引擎,否则请避免在容器内创建文件-在这种情况下,请使用卷(由Docker推荐,并且也很常见)感)-我们为此使用Elasticsearch。

如果我需要多个自定义配置,则尝试从某个地方(数据库,环境)加载它,或者将配置作为一个卷安装,例如

-v config.yml:/usr/src/app/config.yml


通常,我们只有一项服务=一个存储库,但是有时您必须复制所有依赖项才能创建一个脚本。因此,我们有一个存储库,其中汇总了这些脚本,并使用如下环境变量更改了CMD:

CMD cd /usr/src/app && python -u $RUN_SCRIPT


结合使用ENTRYPOINT和如此处所述的CMD http://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/

然后我们使用各种docker-compose.yml文件来获取所需的设置。

对于某些操作(例如数据库设置),我们可以运行一个容器,例如

docker run --network ournetwork init-profiling


,或者我可以在该容器中运行命令
/>
docker run -it --network ournetwork init-profiling bash
# run_command.sh
^D


我们花了一些时间来最小化容器的占用空间,它们很快就会膨胀。例如,我们为python容器使用一个通用的基本映像。同样,仅当您为每个存储库/容器使用单独的虚拟环境时,诸如pip freeze之类的东西才有意义。

我们暂时不使用swarm / kubernetes,因此我无法为此添加任何其他准则。

评论


您公司的开发人员是否自己码头工人?在每个阶段都使用docker以何种方式实现了DTAP?

– 030
18年4月10日在14:39

现在我们有了一套稳定的服务,因此在创建新存储库之后,开发人员通常会执行git commit + Jenkins来构建容器并将其放入AWS ECS存储库(dev / stage / prod分支和环境)。新的部署主要是检出docker-compose,docker-compose pull和docker-compose up。这不是完美的,但可以。比这要复杂一点,但这是核心。

– Petr Chloupek
18年4月10日在19:34