Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 如何在Gitlab runner上执行基本容器_Docker_Gitlab_Containers_Gitlab Ci Runner - Fatal编程技术网

Docker 如何在Gitlab runner上执行基本容器

Docker 如何在Gitlab runner上执行基本容器,docker,gitlab,containers,gitlab-ci-runner,Docker,Gitlab,Containers,Gitlab Ci Runner,我正在开发一个使用集装箱化环境的CI/CD管道 在我的笔记本电脑上,所有东西都在centos容器中运行,其中包含我的所有工具,而代码和配置则驻留在共享卷上 当我提交时,大部分共享卷被推送到主卷。 但是,例如,我从虚拟环境中排除了任何python二进制文件 在Gitlab中,该容器用作我的“基本”容器,用于执行我的一些runner阶段,以便 对代码和ansible配置执行静态lint测试 用ansible bender打造最终产品的新形象 为了区分环境,我在entrypoint.sh中

我正在开发一个使用集装箱化环境的CI/CD管道

  • 在我的笔记本电脑上,所有东西都在centos容器中运行,其中包含我的所有工具,而代码和配置则驻留在共享卷上
  • 当我提交时,大部分共享卷被推送到主卷。
    • 但是,例如,我从虚拟环境中排除了任何python二进制文件
  • 在Gitlab中,该容器用作我的“基本”容器,用于执行我的一些runner阶段,以便
    • 对代码和ansible配置执行静态lint测试
    • 用ansible bender打造最终产品的新形象
为了区分环境,我在
entrypoint.sh
中使用了一个基本shell,当容器出现时执行该shell,在该shell中,我使用了一个由Gitlab管理的环境变量:
CI\u JOB\u STAGE
。但是当我在本地运行容器时,shell脚本的执行方式似乎与在运行程序上不同。这很疯狂,因为容器的全部意义不是吗

  • 目前还不清楚Gitlab在运行程序主机和容器之间装载共享的位置
  • 测试值
    CI_JOB_STAGE
    的条件似乎不起作用,即使使用和
    echo打印时显示值
  • 出于某种原因,入口点在执行阶段之前和之后执行
我正在给你发挂号信

  • entrypoint.sh脚本
  • 容器在本地运行时的输出
    • 在本例中,通过检查activate二进制文件是否存在,可以看到虚拟环境已经存在,这样环境就被简单地激活了
    • 然后检查flask二进制文件,查看是否需要安装需求
    • 我知道这很原始,但这只是POC
  • 转轮第一级的输出
    • 基于shell脚本,它不应该安装需求,因为这是stage命令的一部分
    • 我不相信它真的这样做了,因为它过得太快了,但信息表明它经历了这种情况
    • if[$CI_JOB_STAGE-eq“locally”]]&&!测试-f.“/env/bin/flask”
      • 如果阶段是本地的(错误:我们清楚地看到阶段是
        lint\u code
      • 烧瓶不存在(好吧,它不会存在,但这并不重要,因为前半部分已经是假的)
这些阶段仍然正确运行,但我发现这一切都非常混乱。有没有人对这些跑步者的表现有详细的了解

吉斯特

Gitlab支持每个卷的行为可能略有不同的情况(执行者可能会装载自定义卷,禁止特权容器)

最重要的是:

  • 准备:创建并启动服务
  • 作业前:克隆、恢复缓存并从以前的阶段下载工件。这是在一个特殊的Docker映像上运行的
  • 工作:用户构建。这是在用户提供的Docker映像上运行的
  • Post作业:创建缓存,将工件上载到GitLab。这是在一个特殊的Docker映像上运行的 我不鼓励在
    entrypoint.sh
    中编写脚本。尝试将其重写为
    .gitlab ci.yml

    stages:
      - install
      - build
      - test
    
    job 0:
      stage: .pre
      script: install some prerequisites 
    
    job 1:
      stage: install
      script:
        - python3 -m venv env
        - source ./env/bin/activate
        - pip install -r ./dev/requirements.txt
    
    job 2:
      stage: build
      script: make build
    
    job 3:
      stage: test
      script: make test
    

    它将使构建具有可复制性,并且更易于阅读。您可以使用,只要确保您使用的是Gitlab>=12.4。

    pre和post作业是否会在
    default:
    部分中指定的容器上执行?也许这就是我搞砸的地方。我是否应该保留默认图像,并为不同阶段指定特定图像?这就解释了为什么每次执行之前和之后都会执行我的
    entrypoint.sh
    。@MarkChassy每个阶段可以使用不同的图像,但会变得更复杂。除非您有特殊要求,否则最好使用维护良好的映像,例如
    python:3.7
    和每个运行依赖于安装的Pypi模块。您可能会比Python版本更频繁地更改依赖模块。或者每个阶段你可能有不同的
    requirements.txt
    。我的账户在一封基于工作的电子邮件上,当我离开工作时,我失去了所有的代表。。。那会教我的。