我在我的项目中使用gitlab-ci。我已经创建了一个
image
和 push
它到 gitlab 容器注册表。为了创建图像并将其注册到
gitlab container registry
,我创建了一个 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 CI 中与 docker 执行器一起运行,无论是服务还是作业,只要它没有被作业配置覆盖即可。
如果您尝试在工作
image:
中使用此图像,则会遇到两个关键问题。
if
状况永远不会在这里发生。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,或者如果您想使用具有不兼容入口点的公共映像,这可能很有用。
根据我的经验和挣扎,我无法让 Gitlab 自动使用 EXEC。与尝试让登录 shell 轻松工作以获取环境变量相同。相反,您必须从 CI 手动运行它。
# .gitlab-ci.yml
build:
image: your-image-name
stage: build
script:
- /bin/bash ./scripts/entry-gitlab-ci.sh
在 .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