因此,如果我有一个应在Circle-CI中运行的构建脚本,那么我需要一个Docker映像才能在其中运行该脚本。
只要在镜像中安装了docker,git,gettext(用于envsubst
命令)和awscli(用于身份验证),我们用于多个项目的通用构建脚本就可以在高山linux上正常运行。
我已经制作了一个这样的自定义dockerfile:
FROM docker:18.06.1-ce-git
RUN apk add gettext python3
RUN pip3 install awscli
ADD https://storage.googleapis.com/kubernetes-release/release/v1.8.7/bin/linux/amd64/kubectl /usr/local/bin/kubectl
RUN chmod +x /usr/local/bin/kubectl
这适用于多个项目,但是在一个项目中,我们突然需要一个比我在运行该映像时能够安装的版本更高的go版本,因为基础映像所基于的alpine:3.8
没有最新版本。
golang:1.11.0-alpine3.8
的版本正确,但是如果我将其用作映像,则通用脚本将无法工作,因为它没有安装docker和kubectl等。
那么正确的方法是什么?
我应该:
根据上述内容创建一个新的自定义dockerfile,然后复制粘贴https://raw.githubusercontent.com/docker-library/golang/e06b00cbe4974436ee00eaec215d7fbb123cbc24/1.11/alpine3.8/Dockerfile中的60行代码以获取正确的go版本?
还是基于golang制作一个,然后将https://raw.githubusercontent.com/docker-library/docker/6c9844cf7bc73d87cf884f7e347c6a7b060f8530/18.09-rc/Dockerfile中也有60条的行复制粘贴到其中以获取docker?
无论哪种情况,每次我想更新到较新的版本时,都要手动从最新版本复制并粘贴。 (或者使用一些外部工具自动提取最新的docker镜像并将其连接起来,从而删除多余的FROM alpine:3.8
行。)
在我看来,复制大块代码应该是首选的处理方法,而不是仅更新版本号,这似乎是错误的。
还是应该在同一Dockerfile中使用包含多个FROM
语句的多阶段构建,以某种方式找出docker或golang将所有文件放置在何处,然后手动将所有文件复制到新映像中? (这似乎比复制粘贴大量代码要难得多,但是apparently this is one way to do this)
还是我应该以某种方式彼此旋转几个docker映像,还是使用docker compose运行一组映像以某种方式在ci脚本内部运行构建过程的每个小部分?
< / li>(或者我应该放弃尝试制作一个最小的Docker映像,该映像在几秒钟内加载,而只是使用一个庞大的Docker映像,其中包含我需要的每个软件包中的最新软件包,以及数百个我不是真的软件包需要,这会使每个构建速度减慢几分钟。)
您会直观地认为,存在某种Dockerfile语法可以简单地包括实际上将为我执行复制粘贴的所有指令(当然,忽略FROM语句)。但是包含INCLUDE语句has been proposed and rejected before,因此这显然不是正确的docker工作方式。