Docker合成为CI管道

py49o6xq  于 2023-01-04  发布在  Docker
关注(0)|答案(1)|浏览(114)

所以我们使用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

好了,现在来看看真正的问题。合成文件的depends_on部分不等待install容器完成,它只等待npm命令运行。因此,一旦npm命令正式加载并运行,test容器将开始运行并报告还没有node_modules。这是因为npm正在运行并不意味着npm命令实际上已经完成。
任何人都知道一些技巧来更好地控制docker认为是done的东西,我研究的所有解决方案都是使用某种 Package 器脚本来监视内部docker网络上的一些端口,以等待一个服务,比如一个db,完全打开并准备好。
当使用k8s时,我可以设置一个准备探测器,这是超级涂料,似乎不是Docker组合的一个功能,虽然。我错了吗?如果只是写一个命令,Docker使用它来确定done的意思会很好。
现在,我们必须手动运行每一步,然后在上一步完成后运行下一步,如下所示:

docker-compose up install

等等......

docker-compose up test

我们只想说:

docker-compose up

并且通过等待前面的步骤以正确的顺序完成所有步骤。

k4aesqcs

k4aesqcs1#

我经历了同样的问题,这是一个权限相关的事情,当你从你的本地机器Map到docker。

volumes:
  - .:/home/node:Z

在容器中创建一个文件,并检查同一文件在本地计算机中的权限,如果您看到root用户或任何其他用户是所有者,而不是您的当前用户,则必须首先运行

export DOCKER_USER="$(id -u):$(id -g)"

且改变了

user: node

作者

user: $DOCKER_USER

PS:我假设你可以运行docker而不必使用sudo,只是提到这个bc这是我的场景。

相关问题