在 GitLab-ci Docker build 中执行外部 bash 脚本

Posted

技术标签:

【中文标题】在 GitLab-ci Docker build 中执行外部 bash 脚本【英文标题】:Execute external bash script inside GitLab-ci Docker build 【发布时间】:2019-10-06 18:12:41 【问题描述】:

我想从 gitlab-ci.yml 执行一个外部(在本地机器上)bash 脚本,它使用 docker:stable 映像。我想执行位于 gitlab docker 映像之外的 startup.sh。这是可能的还是有更好的选择?

gitlab-ci.yaml

image: docker:stable

#Build script

variables:
  CI_DEBUG_TRACE: "true"
  DOCKER_DRIVER: overlay

before_script:
  - docker --version

build:
  services:
  - docker:dind
  script:
    - docker build --no-cache -t <tag> .
    - docker login -u root -p <pass> <registry>
    - docker tag ...
    - docker push ...
    - echo "build completed"
  stage: build
  tags:
    - <tag>

deploy_staging:
  stage: deploy
  script:
    - ./sh startup.sh

bash 脚本

#!/bin/bash

docker login -u root -p <pass>
docker pull <image>
docker-compose up -d

【问题讨论】:

您能否详细说明您希望通过此设置实现的目标。问题很混乱。 你想在容器内还是容器外执行你的外部脚本? 所以我目前的设置是这样的:我的服务器上有一个 docker gitlab 实例,当我将代码提交到我的存储库时,它会自动构建一个包含更新代码的 docker 映像并将其作为 gitlab 注册表推送到“最新”图像。现在,当构建完成时,bash 脚本应该会自动从 gitlab 注册表中提取新图像,docker 将其组合起来,以便重新创建为网站提供服务的容器。构建脚本 (gitlab-ci.yaml) 完全发生在 docker 容器内,所以我不知道它如何访问主机上的 bash 脚本。我希望这能解决问题? 【参考方案1】:

我不确定这是否是您的用例的最佳实践,但 与图像共享文件的简单方法是添加卷并通过编辑 config.toml 文件将此代码共享到图像。

将此行添加到 [runners.docker] 下的 config.toml

volumes = ["/cache",startup.sh 的路径:/root/scripts"]

然后在 your.gilatb.yml 中

    deploy_staging:
      stage: deploy
      script:
        - chmod +x /root/scripts/startup.sh     
        - ./sh /root/scripts/startup.sh

【讨论】:

这会在gitlab-ci.yml文件中创建的docker镜像里面执行sh,而不是在文件所在的服务器上执行,对吧?

以上是关于在 GitLab-ci Docker build 中执行外部 bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章

gitlab-ci docker-in-docker 访问不安全的注册表

如何将存储库中的文件复制到用于作业的 Docker 容器中,在 gitlab-ci.yml

如何在gitlab-ci.yml中将文件从存储库复制到用于作业的docker容器中

.gitlab-ci.yml配置参数

如何在 gitlab-ci build 中跳过前面的 maven 目标?

使用 gitlab-ci.yml 的 Docker 内部的 Docker