好的,我已经对此进行了全面研究,但似乎找不到明确的答案。
我想知道 gitlab-runner docker executor 如何设置镜像的卷。从我发布的第二个 URL 中,我看到您可以将目录放在主机上以供镜像使用,就像在 docker run 中使用 -v 选项一样,但是它是一个绝对路径,如果运行并行作业则无法工作,因为目录会发生变化。但是,我找不到是否可以将 $PWD 用于构建目录,或者由于 config.toml 文件位于不同的位置,这是否可以工作。从我读过的文档中可以看出,它没有说明它将如何工作,或者是否可以工作。在下一个冲刺期间,我会花费数小时尝试让某些可能工作也可能不工作的东西工作,在此之前,我正试图找到一些答案。所以希望得到一些见解。
所以我的问题是:以前有人遇到过这个问题吗?如果是,你是如何设置的,以便构建目录成为传递给 docker 镜像的目录?与使用“-v”选项运行 docker build 或使用“volume:”运行 docker compose 时的方式相同。
我想以这种方式运行图像而不是使用 shell 执行器(我目前正在这样做)的原因在于,如果您取消构建,则必须进入并手动终止运行器服务器上的图像。您可以想象,如果有多个构建正在进行,这可能会很烦人且耗时。
我还希望避免创建自定义 docker 镜像,因为我不想将 git 存储库放入 docker 镜像中。我只想制作可在 CI/CD 存储库中重复使用的附加 docker 镜像,因此我不想将其作为命令添加到将被复制到镜像中的 shell 脚本中,从而使镜像无法重复使用。
如果上述方法不可行,是否有办法将目录作为变量“导出”到 docker 镜像?我认为没有,因为 docker 必须在启动时将卷传递给镜像。
我也不想每次在 CI/CD 中运行测试时都必须构建 docker 镜像,因为这样既耗时又费钱。我宁愿传递卷并运行进行测试所需的命令。
如果在 shell 脚本中运行命令:$ docker run -d -p 80:80 --name my-apache-php-app -v "$PWD":/var/www/html php:7.0-apache
希望这是该问题的正确论坛,不确定这是否属于 stackoverflow 或 serverfault。
经过进一步研究,似乎运行器实际上在作为映像列出的 docker 容器中运行 git 命令并将服务链接到它。但是,非常令人困惑,因为他们并没有真正说明这一步,所以我仍然不知道它是在主机还是容器的构建目录中运行 git 命令,如果是容器,那么我需要更新 docker 文件。
参考:
答案1
答案是……它通过创建目录然后克隆到镜像中的构建目录,就像调用 docker exec 一样。因此,当您运行命令时,您是在构建容器中运行它们,该容器镜像使用“image:”键设置。因此,为了将脚本从主机系统放入构建容器,您必须将卷从主机设置为构建容器。因此,我在镜像中放了一个额外的目录,我把它叫做 tools_for_ci,然后我将一个包含所有这些脚本的目录挂载到镜像中。这很有效。现在出现的问题是,docker 镜像无法与服务来回通信。这是 docker 执行器的一个已知障碍,网站上没有任何改进,我看到的所有问题都标记为积压。因此不幸的是,看起来短期内不会实施修复。
简而言之,镜像在运行时从 repo 获取所需的所有文件,这意味着您不需要设置卷,除非您正在将脚本从主机传输到镜像。所有脚本命令也在镜像上执行。
但是,docker in docker 在绑定到 docker 套接字时似乎会保存图像,这样您就不必每次都重新下载。所以我可能会尝试这样做来解决图像和服务之间来回通信的问题。