如何在 GitLab CI 中的其他内容之前在 PATH 中设置 docker-credential-ecr-login

2023-12-27

我正在使用 AWS ECR 托管私有 Dockerfile 映像,并且我想在 GitLab CI 中使用它。

根据文档,我需要设置 docker-credential-ecr-login 来获取私有映像,但我不知道如何在其他事情之前做到这一点。这是我的 .gitlab-ci 文件:

image: 0222822883.dkr.ecr.us-east-1.amazonaws.com/api-build:latest

tests:
  stage: test
  before_script:
    - echo "before_script"
    - apt install amazon-ecr-credential-helper
    - apk add --no-cache curl jq python py-pip
    - pip install awscli
  script:
    - echo "script"
    - bundle install
    - bundle exec rspec
  allow_failure: true # for now as we do not have tests

谢谢。


我确认 GitLab CI 中尚未提供该功能;然而,我最近发现可以实现一种通用的解决方法,在取自私有 Docker 镜像的容器内运行专用 CI 脚本。

模板文件.gitlab-ci.yml下面是根据OP的示例改编的,使用Docker 中的 Docker http://blog.teracy.com/2017/09/11/how-to-use-docker-in-docker-dind-and-docker-outside-of-docker-dood-for-local-ci-testing/我建议的方法这另一个答案 https://stackoverflow.com/a/59689194/9164010,本身的灵感来自于GitLab CI 文档处理dind https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#container-registry-examples:

stages:
  - test

variables:
  IMAGE: "0222822883.dkr.ecr.us-east-1.amazonaws.com/api-build:latest"
  REGION: "ap-northeast-1"

tests:
  stage: test
  image: docker:latest
  services:
    - docker:dind
  variables:
    # GIT_STRATEGY: none  # uncomment if "git clone" is unneeded for this job
  before_script:
    - ': before_script'
    - apt install amazon-ecr-credential-helper
    - apk add --no-cache curl jq python py-pip
    - pip install awscli
    - $(aws ecr get-login --no-include-email --region "$REGION")
    - docker pull "$IMAGE"
  script:
    - ': script'
    - |
      docker run --rm -v "$PWD:/build" -w /build "$IMAGE" /bin/bash -c "
        export PS4='+ \e[33;1m($CI_JOB_NAME @ line \$LINENO) \$\e[0m '  # optional
        set -ex
        ## TODO insert your multi-line shell script here ##
        echo \"One comment\"  # quotes must be escaped here
        : A better comment
        echo $PWD  # interpolated outside the container
        echo \$PWD  # interpolated inside the container
        bundle install
        bundle exec rspec
        ## (cont'd) ##
      "
    - ': done'
  allow_failure: true # for now as we do not have tests

此示例假设 Docker$IMAGE包含/bin/bash二进制,并依赖于所谓的块样式 https://yaml.org/spec/1.2/spec.html#style/block/YAML 的。

上面的模板已经包含注释,但要独立:

  • 如果 Bash 命令包含双引号,则需要转义双引号,因为整个代码被docker run … " and ";
  • 您还需要转义本地 Bash 变量(参见\$PWD上面),否则这些变量将在运行之前解决docker run … "$IMAGE" /bin/bash -c "…"命令本身。
  • 我更换了echo "stuff"左右命令更有效colon https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_16对方:
    set -x
    : stuff
    : note that these three shell commands do nothing
    : but printing their args thanks to the -x option.
    

[欢迎提供反馈,因为我无法直接测试此配置(我不是 AWS ECR 用户),但我对 OP 的示例同时包含一些内容感到困惑apt and apk命令...]

关于陷阱的相关评论set -e

请注意,以下脚本有错误:

set -e
command1 && command2
command3

即,改为写:

set -e
command1 ; command2
command3

or:

set -e
( command1 && command2 )
command3

要确信这一点,您可以尝试运行:

bash -e -c 'false && true; echo $?; echo this should not be run'
  → 1
  → this should not be run
bash -e -c 'false; true; echo $?; echo this should not be run'
bash -e -c '( false && true ); echo $?; echo this should not be run'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 GitLab CI 中的其他内容之前在 PATH 中设置 docker-credential-ecr-login 的相关文章

随机推荐

  • 在 Tornado 的线程中运行长阻塞函数时出现问题

    我对龙卷风很陌生 只是看看如何处理龙卷风中阻塞的请求 我在单独的线程中运行阻塞代码 然而 主线程仍然阻塞 直到线程函数完成 我在这里没有使用 gen coroutine 但已经尝试过 结果是相同的 counter 0 def run asy
  • 使用水豚复制粘贴?

    我想做这样的事情 div find some div copy to clipboard div input find my input paste from clipboard input 我不想用这个来模拟send keys并使用 Ct
  • RStudio 闪亮错误 mysqlNewConnection 最多 16 个连接

    我有一个正在运行的闪亮服务器 它连接到 MySQL 数据库 到目前为止工作正常的页面现在给我这个错误 Error in mysqlNewConnection drv RS DBI driver cannot allocate a new c
  • 如何检查android webview中的所有元素

    When i inspect an website with Chrome i can to see some iframe data like this Example Chrome inspect https i stack imgur
  • ASP.NET MVC 中的 DropdownList - 值未发布

    我在 ASP MVC Razor 中有一个表单 在这个表单中我有一个文本框 和一个
  • ASP.Net Core 2.1 中的身份< - 自定义 AccountController

    我已经安装了ASP NET Core 2 1但即使我创建了一个新的ASP NET Core Web Application using ASP NET Core 2 1 with Individual User Accounts Store
  • 无法在 .NET Core 项目中使用 T4 模板

    我有一个 NET Core 类库项目 我想使用设计时 T4 模板 模板编译正确 但是当我尝试使用反射时 它会引发错误 Running transformation System IO FileNotFoundException Could
  • 什么时候不应该重构?

    我们都知道重构很好 我和下一个人一样喜欢它 但是你有真实的案例吗 not重构 像时间关键的东西或同步之类的东西 技术或人为原因同样受欢迎 真实案例场景和经验优先 Edit 从迄今为止的答案来看 不重构的唯一原因似乎是金钱 我的问题主要与这样
  • MS SQL Server 与 Rails 4

    我想在 Rails 4 上创建一个使用现有 MS SQL 数据库的应用程序 该应用程序可以从使用 Rails 4 及其所有新功能中受益匪浅 但似乎每个人都推荐使用 gem activerecord sqlserver adapter 不支持
  • AJAX 和自签名证书

    我正在尝试将 AJAX 请求发送到使用自签名证书的 REST API 网站 问题是 当我第一次访问该网站时 它抱怨此证书问题 当我执行 AJAX 请求 没有先接受此证书 时 它会默默失败 问题是这种情况下该怎么办 我应该要求用户访问该网站并
  • 在 cbind 或 rbind 之后丢失表的暗名称

    After cbind or rbind ing 一个表对象 例如 添加总和的余量或类似的东西 暗名称的名称会丢失 请参阅y 我找到了这个 解决方法 但想知道是否有一个现成的解决方案 看起来不那么老套 也许可以即时完成一些事情 我想保留班级
  • 404 Not Found:Angular 2 无法与 Spring Rest API 对话

    我按照 Angular 2 的 Tour of Hero 教程使用内存数据库进行操作 然后我创建了一个 Spring 后端来提供数据 并希望将 Angular2 与 Spring 的 Rest API 集成 在英雄之旅中我只改变了hero
  • 概念评估是否可以取决于评估地点?

    温度概念 5 http eel is c draft temp concept 5 sentence 1 says 概念未实例化 temp spec 注 表示概念专门化的 id 表达式被计算为表达式 expr prim id 这是否意味着这
  • 爆炸和 in_Array 搜索不起作用

    好的 这里是代码键盘http codepad org ZQz0Kn3R http codepad org ZQz0Kn3R function processContent content min count 2 exclude list a
  • moment.js 获取当前时间(以毫秒为单位)?

    var timeArr moment format HH mm ss split var timeInMilliseconds timeArr 0 3600000 timeArr 1 60000 这个解决方案有效 测试一下 但我宁愿只使用
  • 内容菜单和打开选项卡的问题 - Chrome 扩展

    我遇到以下问题 在网页上检测到选择后 以下代码未显示 目前 当我选择文本时 上下文菜单没有显示 Code function getword info tab if info menuItemId google console log Goo
  • 在 Woocommerce 3+ 中保存并显示订单自定义元数据

    不久前 我的合作伙伴帮助我在结帐页面添加了自定义字段 我们想问人们 您是如何听说我们的 当他们预订我们的活动时 我们把它放在一起 但不久之后我们就无法正确看到结果了 在发送给管理员的 新订单 电子邮件中 出现 您是如何听说我们的 标签 但没
  • 在序言中将某些字符从列表复制到另一个列表

    所以我有这段代码 它将所有内容从列表复制到另一个列表 我应该如何修改它才能复制 比如说前两个字符 copy L R copy2 L R copy2 X X copy2 H T1 H T2 copy2 T1 T2 我想要的示例 copy a
  • 在 C# 中使用“类型”对象进行类型转换

    到目前为止 这对我来说有点棘手 我想知道是否可以使用 System Type 对象对对象进行类型转换 我在下面说明了我的意思 public interface IDataAdapter object Transform object inp
  • 如何在 GitLab CI 中的其他内容之前在 PATH 中设置 docker-credential-ecr-login

    我正在使用 AWS ECR 托管私有 Dockerfile 映像 并且我想在 GitLab CI 中使用它 根据文档 我需要设置 docker credential ecr login 来获取私有映像 但我不知道如何在其他事情之前做到这一点