执行shell脚本时未找到gitlab-Docker命令

执行shell脚本时未找到gitlab-Docker命令,docker,gitlab,Docker,Gitlab,我正在执行一个包含所有依赖项和集成测试的管道。对于集成测试,我编写了一个shell脚本,它运行postgres db的docker image并在其中执行查询。在我的.gitlab-ci.yml文件中,当我放置集成测试阶段并运行管道时,当它执行shell脚本时,它会说docker未找到。 然而,如果我在.gitlab-ci.yml中的任何一个阶段中运行docker info,那么它就会正确执行 脚本具有命令行- docker run --rm --name pg_test -d -p 5100:

我正在执行一个包含所有依赖项和集成测试的管道。对于集成测试,我编写了一个shell脚本,它运行postgres db的docker image并在其中执行查询。在我的.gitlab-ci.yml文件中,当我放置集成测试阶段并运行管道时,当它执行shell脚本时,它会说docker未找到。 然而,如果我在.gitlab-ci.yml中的任何一个阶段中运行docker info,那么它就会正确执行

脚本具有命令行-

docker run --rm --name pg_test -d -p 5100:5432 -e POSTGRES_USER=pg -e POSTGRES_PASSWORD=aaaaaa -e POSTGRES_DB=db_test postgres:9.6
错误-已成功启动进程“命令”sh“” ./src/integration/scripts/testDBSetup.sh:第1行:未找到docker

我们的期望是脚本应该正确执行,docker应该在其中可用

我们正在使用自我管理的git实验室和共享资源

gitlab阶段

build.gradle代码:

testDBSetup.sh:


GitLab CI提供了一个名为的功能,让您可以运行自动链接到作业的其他容器。看来这正是你想要实现的。还有一个问题

对于作业docker测试,您不定义图像。因此,它在带有aws的deskera/docker中运行,其中显然包含docker安装。您的集成测试运行在Alpine Linux容器中,该容器通常不包含Docker安装

解决方案1: 创建一个包含docker和gradle的图像,如Nicolas Pepinster所述

解决方案2: 在集成测试中添加一个参数,以区分本地开发环境和GitLab CI。然后使用服务运行Postgres数据库。

正如@lukket所说,gradle:alpine image不包含docker runtime

您需要创建一个包含docker和gradle的图像。您可以像这样使用dind java映像,因为gradle需要java

生成映像后,在集成测试作业中,请参考nuew生成的映像:

integration-test:
  image: dind-gradle:latest
  stage: integration-test
  script:
    - gradle itest --info

同时在配置文件中保留服务docker:19.03.0-dind。

如果您尝试在docker测试作业中添加image:gradle:alpine,docker信息是否仍然有效?@nicolaspinster-您是正确的,如果我在stage docker测试中添加image:gradle:alpine,docker信息将不起作用。我已经在使用服务:-docker:19.03.0-dind,我只需要为postgres执行docker image,以便相同的脚本可以在本地使用,也可以通过gitlab使用。请参阅更新后的文章,并使用actual.gitlab-ci.ymlI查看。但是,您可能需要构建一个自定义映像来运行集成测试。包含Docker和Gradle的图像。是否不能在GitLab CI和本地手动启动的容器中使用参数化测试脚本和服务?是的,该服务位于my.GitLab-CI.yml文件中,如本文所示。我尝试了几张图片,但都没有成功——shifudao/docker gradle、dtforce/dind gradle、keeganwitt/docker gradle root。我应该创建新的自定义图像吗?或者任何人都可以工作?这取决于你。依我拙见,这不值得努力。我对Gradle不是很熟悉,但是像前面描述的那样只添加一个参数听起来容易多了。我尝试了几张图片,但都没有成功——shifudao/docker gradle、dtforce/dind gradle、keeganwitt/docker gradle root。我应该创建新的自定义图像吗?或者现有的任何人都可以工作?我认为dtforce/dind gradle可以工作,因为docker是显式安装在Dockerfile中的,但我测试了,事实并非如此。恐怕你需要创造自己的形象。
task setupTestDB(type :Exec){
    commandLine 'sh','./src/integration/scripts/testDBSetup.sh'
}

task itest(type: Test, dependsOn: "test") {
    description = 'Runs the integration tests.'
    dependsOn setupTestDB
    useTestNG()
    mustRunAfter test
}
docker run --rm --name pg_test -d -p 5100:5432 -e POSTGRES_USER=pg -e POSTGRES_PASSWORD=aaaaaa -e POSTGRES_DB=db_test postgres:9.6
integration-test:
  image: dind-gradle:latest
  stage: integration-test
  script:
    - gradle itest --info