gitlab-runner 不运行 Dockerfile 中的 ENTRYPOINT 脚本

问题描述 投票:0回答:3

我在我的项目中使用gitlab-ci。我已经创建了一个

image
push
它到 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** 脚本。
问题是什么?
gitlab-ci gitlab-runner
3个回答
4
投票

图像入口点肯定会在 GitLab CI 中与 docker 执行器一起运行,无论是服务还是作业,只要它没有被作业配置覆盖即可。

如果您尝试在工作

image:
中使用此图像,则会遇到两个关键问题。

  1. GitLab 覆盖图像的命令。所以你的
    if
    状况永远不会在这里发生。
  2. 您的入口点应该准备好运行 shell 脚本。因此,您应该使用类似
    exec /bin/bash
    而不是
    exec "$@"
    的内容作为工作图片。
    根据文档:

运行程序期望图像没有入口点或者入口点已准备好启动 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,或者如果您想使用具有不兼容入口点的公共映像,这可能很有用。


2
投票

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

# .gitlab-ci.yml
build:
    image: your-image-name
    stage: build
    script:
        - /bin/bash ./scripts/entry-gitlab-ci.sh

0
投票

在 .gitlab-ci.yaml 文件中将此变量设置为 true。

例如:

include:
  - project: 'project-path'
    ref: <version>
    file: 'template.gitlab-ci.yml'

variables:
  FF_KUBERNETES_HONOR_ENTRYPOINT: true

本文档中提到了这一点。 https://docs.gitlab.com/runner/executors/kubernetes/#container-entrypoint-known-issues

© www.soinside.com 2019 - 2024. All rights reserved.