[英]Docker Compose as a CI pipeline
所以我们使用 Gitlab CI。 问题是每次我们想要测试我们的构建管道是否配置正确时都必须提交的痛苦。 不幸的是,当我们的容器/管道无法正常工作时,无法在本地轻松测试 Gitlab CI。
我们的解决方案,使用docker-compose.yml
作为 CI 管道运行器,用于本地测试容器化构建步骤,你为什么不知道。 . . ? 基本上 Gitlab CI 和大多数其他部分让每个部分生成一个容器来运行命令,并且在前面的步骤完成之前不会继续,即第一步必须完全完成,然后下一步才会发生。
这是我们使用的一个简单.gitlab-ci.yml
文件:
stages:
- install
- test
cache:
untracked: true
key: "$CI_COMMIT_REF_SLUG"
paths:
- node_modules/
install:
image: node:10.15.3
stage: install
script: npm install
test:
image: node:10.15.3
stage: test
script:
- npm run test
dependencies:
- install
这是我们将其转换为的docker-compose.yml
文件:
version: "3.7"
services:
install:
image: node:10.15.3
working_dir: /home/node
user: node
entrypoint: npm
command:
- install
volumes:
- .:/home/node:Z
test:
image: node:10.15.3
working_dir: /home/node
user: node
entrypoint: npm
command:
- run
- test
volumes:
- .:/home/node:Z
depends_on:
- install
好的,现在是真正的问题。 compose 文件的depends_on
部分不等待install
容器完成,它只是等待 npm 命令运行。 因此,一旦 npm 命令正式加载并运行, test
容器将开始运行并抱怨还没有node_modules
。 发生这种情况是因为 npm 正在运行并不意味着 npm 命令实际上已经完成。
任何人都知道更好地控制 docker 认为要done
的事情的任何技巧。 我研究的所有解决方案都使用某种包装脚本,该脚本监视内部 docker.network 上的某个端口以等待服务(如数据库)完全打开并准备就绪。
使用 k8s 时,我可以设置一个准备就绪探测器,它非常棒,但似乎不是 Docker Compose 的功能。 我在这里错了吗? 最好只写一个命令,docker 使用它来确定done
的含义。
现在我们必须手动运行每个步骤,然后在前面的步骤完成后运行下一步,如下所示:
docker-compose up install
等待....
docker-compose up test
我们真的只想说:
docker-compose up
并通过等待前面的步骤以正确的顺序完成所有步骤。
我遇到了同样的问题,当您从本地计算机映射到 docker 时,这是与权限相关的事情。
volumes:
- .:/home/node:Z
在容器内创建一个文件,并在本地机器上检查同一个文件的权限,如果你看到 root 用户或其他任何东西是所有者,而不是你当前的用户,你必须先运行
export DOCKER_USER="$(id -u):$(id -g)"
并改变
user: node
经过
user: $DOCKER_USER
PS:我假设你可以运行 docker 而不必使用 sudo,只是提到这个 bc 这是我的场景。
这个问题是很多年前的了。 我现在使用这个项目: https://github.com/firecow/gitlab-ci-local
它使用 docker 在本地运行 Gitlab 管道,就像您期望的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.