Docker:错误提示


当我学会驾驶汽车时,在第一堂课中,教练向后走到交叉路口,然后说你不应该这样做-绝对不要。 这条规则我立即记住,终生铭记。


您阅读了格里高利·奥斯特(Grigory Oster)的给孩子的“坏建议”,您发现无法做到这一点对他们来说是多么容易和自然。


关于如何正确编写Dockerfile的文章很多。 但是我没有遇到有关如何编写错误的Dockerfile的说明。 我填补了这一空白。 也许在我寻求支持的项目中,此类dockerfile将会更少。


所有英雄,情况和dockerfile都是虚构的。 如果您认识自己,对不起。


创建一个不祥且可怕的Dockerfile


彼得(资深Java / ruby​​ / php开发人员):同事瓦西里,您已经将新模块上传到Docker吗?
Basil(初级):不,我没有,我无法通过此Docker弄清楚。 上面有那么多文章,我的眼睛睁大了。


彼得:我们一年前有个截止日期。 我们来帮忙,我们会在过程中解决问题。 告诉我你在那里不能做什么。


罗勒(Basil):我无法选择基本图像,以使图像最小化,但是有所有需要的东西。
彼得:以ubuntu的图片为例,它具有您需要的一切。 多余的东西会派上用场。 并且不要忘了贴上最新标签,以便该版本始终是最新的。


在Dockerfile中,出现第一行:


FROM ubuntu:latest 

彼得:接下来是什么,我们写了什么模块?
Basil:ruby,应该启动一个Web服务器和几个服务守护进程。
彼得:是的,我们需要什么:ruby,bundler,nodejs,imagemagick,还有其他什么呢……同时,请升级以确保获得新软件包。
罗勒:我们将不会创建用户,而不是从根目录创建用户?
彼得:哦,他很好,然后仍然到处乱逛。
瓦西里(Vasily):我需要大约15分钟的时间才能在一个团队中做到这一点,我读到...
(彼得无礼地打断了精心细致的六月。)
彼得:在不同的团队中撰写,阅读起来会更容易。


Dockerfile正在增长:


 FROM ubuntu:latest RUN apt-get update RUN apt-get upgrade RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full RUN gem install bundler RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs RUN bundle install --without development test --path vendor/bundle RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

然后Igor Ivanovich冲进办公室,DevOps(但Ops比Dev多),大喊:


AI:Petya,您的开发人员再次破坏了prod数据库,何时结束....


经过一番小冲突之后,伊戈尔·伊万诺维奇(Igor Ivanovich)冷静下来,开始了解他的同事在这里做什么。


AI:你在做什么?
罗勒:Peter帮助我为新模块编译了Dockerfile。
II:让我们看一看...在这里写了什么,用一个单独的命令清理了存储库,这是一个附加的层...但是,如果不复制Gemfile,如何放置依赖项! 而且无论如何,这是不好的。
彼得:请您处理您的业务,我们会以某种方式解决。


伊戈尔·伊万诺维奇(Igor Ivanovich)悲伤地叹了口气,离开去找出谁破坏了数据库。


彼得:是的,但是关于代码,他说的没错,您需要将其填充到图像中。 然后立即放置ssh和超级用户,否则我们将启动守护程序。


瓦西里(Vasily):然后我首先复制Gemfile和Gemfile.lock,然后将所有内容放入,然后复制整个项目。 如果Gemfile不变,则将从缓存中获取图层。
彼得:这些层都有什么,一次复制所有内容。 立即复制。 第一行。


Dockerfile现在看起来像这样:


 FROM ubuntu:latest COPY ./ /app WORKDIR /app RUN apt-get update RUN apt-get upgrade RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor RUN gem install bundler RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs RUN bundle install --without development test --path vendor/bundle RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

彼得:那接下来呢。 您有主管的配置吗?
罗勒:不,不。 但是我会尽快做的。
彼得:那就去做。 现在让我们勾勒出将运行所有内容的init脚本。 这样,您就可以从nohup开始ssh了,以便我们可以连接到容器并查看出了什么问题。 然后还启动主管。 好吧,那就跑乘客吧。
问:但是我读到应该有一个进程,所以Docker会知道出了点问题,可以重新启动容器。
警:别打扰你的头。 一般来说,如何? 您如何在一个过程中全部运行? 让伊戈尔·伊万诺维奇(Igor Ivanovich)考虑稳定,而不是一无所获。 我们的业务是编写代码。 而且,无论如何,请让他说谢谢您为他编写Dockefile。


10分钟后,观看了两个有关猫的视频。


问:我做了一切。 我还添加了评论。
警:显示!


Dockerfile的新版本:


 FROM ubuntu:latest #    COPY ./ /app WORKDIR /app #    RUN apt-get update #   RUN apt-get upgrade #    RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor #  bundler RUN gem install bundler #  nodejs     RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs #   RUN bundle install --without development test --path vendor/bundle #     RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* #  ,   ,    . CMD [“/app/init.sh”] 

警:太好了,我喜欢。 俄语注释方便且可读,每个人都可以那样工作。 我教了你一切,然后你就可以自己做。 我们去喝咖啡吧...


好吧,这里有一个绝对可怕的Dockerfile,Igor Ivanovich希望退出该文件,而他的视线又会受伤一周。 当然,Dockerfile可能会更糟,完美无止境。 但是对于初学者来说,它会做到的。


最后,我想引用格雷戈里·奥斯特(Gregory Oster)的话:


如果你还不确定
他们选择了人生之路,
而且你不知道为什么
努力开始
打败门廊中的灯-
人们会说谢谢。
你会帮助人民
保护电力。


UPD :在评论中,他们询问这些Dockerfile有什么问题。 前几天,我将写一篇单独的文章,分析错误。

Source: https://habr.com/ru/post/zh-CN449944/


All Articles