1

我在我的项目中使用gitlab-ci 。我已经创建了一个imagepush它到 gitlab 容器注册表。

为了创建图像并将其注册到gitlab container registry,我创建了一个Dockerfile.

Dockerfile:

...

ENTRYPOINT [ "scripts/entry-gitlab-ci.sh" ]
CMD "app"
...

入口-gitlab-ci.sh:

#!/bin/bash
set -e

if [[ $@ == 'app' ]]; then
  echo "Initialize image"
  rake db:drop
  rake db:create
  rake db:migrate
fi

exec "$@"

图像将被成功创建,但是当 gitlab-runner 拉取并执行创建的图像时,不会运行 **entry-gitlab-ci** 脚本。
问题是什么?
4

2 回答 2

0

图像入口点肯定在 GitLab CI 中使用 docker 执行器运行,用于服务和作业,只要它没有被作业配置覆盖。

如果您尝试在工作 image:中使用此图像,则存在两个关键问题。

  1. GitLab 会覆盖图像的命令。所以你的if情况永远不会在这里。
  2. 您的入口点应该准备好运行 shell 脚本。所以,你应该使用类似exec /bin/bashnotexec "$@"作为工作形象的东西。
    根据文档:

运行程序期望映像没有入口点,或者入口点准备启动 shell 命令。

所以你的入口点可能看起来像这样:

#!/usr/bin/env bash

# gitlab-entrypoint-script
echo "doing something before running commands"

if [[ -n "$CI" ]]; then
    echo "this block will only execute in a CI environment"
    
    echo "now running script commands"
    # this is how GitLab expects your entrypoint to end, if provided
    # will execute scripts from stdin
    exec /bin/bash
else
    echo "Not in CI. Running the image normally"
    exec "$@"
fi

这假设您使用的是 docker 执行程序,并且运行程序使用的是 docker >= 17.06 的版本

您还可以在作业配置image:中显式设置作业图像和服务图像的入口点。这可能很有用,例如,如果您的图像通常具有入口点,并且您不想在考虑 GitLab-CI 的情况下构建图像,或者如果您想使用具有不兼容入口点的公共图像。

于 2021-12-19T22:21:56.733 回答
0

根据我的经验和努力,我无法让 Gitlab 自动使用 EXEC。与尝试让登录 shell 轻松获取环境变量相同。相反,您必须从 CI 手动运行它。

# .gitlab-ci.yml
build:
    image: your-image-name
    stage: build
    script:
        - /bin/bash ./scripts/entry-gitlab-ci.sh
于 2021-12-19T01:11:40.650 回答