1

我正在尝试使用 jib Maven 插件在 Gitlab 持续集成中使用我的应用程序构建 docker 映像,但我无法使用 dind (docker-in-docker) 服务将插件连接到 docker 守护程序。目前我在我的 gitlab-ci.yml 文件中使用这个配置:

deploy:mvn:
  image: maven:3.6.3-jdk-8-openj9
  stage: deploy
  services:
    - docker:dind
  script:
    - mvn compile jib:dockerBuild

这是我得到的错误:

[错误] 无法执行目标 com.google.cloud.tools:jib-maven-plugin:0.9.11:dockerBuild (default-cli) on project my-application: Build to Docker daemon failed, 也许你应该确保 Docker已安装并且您有正确的权限来运行它-> [帮助 1]


更新

我更新到 2.2.0 并且它在本地运行。我之前添加了docker images命令,插件似乎在Gitlab CI中找不到docker命令:

$ docker images && mvn compile jib:dockerBuild /bin/bash: line 97: docker: command not found

这是 jib 插件的配置:

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>2.2.0</version>
    <configuration>
        <from>
            <image>adoptopenjdk/openjdk11:alpine-jre</image>
        </from>
        <to>
            <image>my-application:latest</image>
        </to>
        <container>
            <entrypoint>
                <shell>sh</shell>
                <option>-c</option>
                <arg>chmod +x /entrypoint.sh &amp;&amp; sync &amp;&amp; /entrypoint.sh</arg>
            </entrypoint>
            <ports>
                <port>8080</port>
            </ports>
            <environment>
                <SPRING_OUTPUT_ANSI_ENABLED>ALWAYS</SPRING_OUTPUT_ANSI_ENABLED>
                <JHIPSTER_SLEEP>0</JHIPSTER_SLEEP>
            </environment>
            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
        </container>
    </configuration>
</plugin>
4

2 回答 2

2

该插件似乎无法在 Gitlab CI 中找到 docker 命令:

不,不是 Jib,而是/bin/bash找不到docker命令。即使在使用 Jib 之前,您也没有docker可用的。仔细查看错误消息。

$ docker images && mvn compile jib:dockerBuild /bin/bash: line 97: docker: command not found

例如,在我的 Linux 上,如果我尝试foo在 shell 脚本中不存在的命令,它会输出相同的消息。

$ /bin/bash -c "foo && mvn -v"
/bin/bash: line 1: foo: command not found

因此,以下没有的命令mvn将失败并出现相同的错误。

script:
  - docker images

这证明docker您的 GitLab 运行时环境中不存在或不在PATH环境变量中。


更新

更新我的答案,因为您回答说您现在使用jib:build而不是jib:dockerBuild.

如果你使用jib:build,你甚至不需要 Docker。Jib 在使用jib:build. 因此,您可以完全忘记设置 Docker 并删除docker:dindand export DOCKER_HOST

mvn compile jib:build -Djib.to.auth.username=$DOCKER_REGISTRY_USER -Djib.to.auth.password=$DOCKER_REGISTRY_PWD

于 2020-04-20T13:48:28.647 回答
0

最后,这是我使用的配置:

services:
    - docker:dind


deploy:mvn:
    image: maven:3.6.3-jdk-8-openj9
    stage: deploy
    script:
        - export DOCKER_HOST=tcp://docker:2375
        - mvn compile jib:build -Djib.to.auth.username=$DOCKER_REGISTRY_USER -Djib.to.auth.password=$DOCKER_REGISTRY_PWD
    only:
        - tags

除了在 Docker 服务中使用 Docker 之外,我还需要建立 DOCKER_HOST 环境变量并将凭据传递给我的mvn jib:build命令。我将凭据作为环境变量存储在 CI 设置中。感谢@Chanseok Oh 的帮助。

也可以看看:

于 2020-04-21T20:28:48.170 回答