Gitlab CI-泊坞窗:找不到命令

Kay*_*Kay 9 gitlab docker gitlab-ci

我正在尝试在gitlab ci管道中构建我的docker映像。

但是,它无法找到docker命令。

/ bin / bash:第69行:docker:找不到命令错误:作业失败:执行远程命令时出错:命令以非零退出代码终止:在Docker容器中执行时出错:1

.gitlab-ci.yml

stages:
  - quality
  - test
  - build
  - deploy

image: node:8.11.3

services:
  - mongo
  - docker:dind

before_script:
- npm install

quality:
  stage: quality
  script:
  - npm run-script lint

test:
  stage: test
  script:
  - npm run-script test

build:
  stage: build
  script:
  - docker build -t server .

deploy:
  stage: deploy
  script:
  - echo "TODO deploy push docker image"
Run Code Online (Sandbox Code Playgroud)

dan*_*y74 8

您有 2 个选项可以解决此问题。您需要编辑 config.toml 文件(位于安装 gitlab 运行程序的位置)。

选项1

在 config.toml 中:

privileged = true
Run Code Online (Sandbox Code Playgroud)

在 .gitlab-ci.yml 中:

myjob:
  stage: myjob
  image: docker:latest
  services:
    - docker:18.09.7-dind # older version that does not need demand TLS (see below)
Run Code Online (Sandbox Code Playgroud)

选项2

在 config.toml 中:

privileged = true
volumes = ["/certs/client", "/cache"]
Run Code Online (Sandbox Code Playgroud)

在 .gitlab-ci.yml 中:

myjob:
  stage: myjob
  image: docker:latest
  services:
    - docker:dind
  variables:
    DOCKER_DRIVER: overlay2 # not sure if this is needed
    DOCKER_TLS_CERTDIR: "/certs"
Run Code Online (Sandbox Code Playgroud)

重要提示:一旦您对 config.toml 进行了更改,您可能需要重新启动 GITLAB RUNNER(这可能会因操作系统而异) - 我确实重新启动了我的,不确定如果您不重新启动它会发生什么!

重新启动 gitlab runner 的说明在这里... https://docs.gitlab.com/runner/commands/ ... 基本上gitlab-runner restart但在 Windows 上我必须使用 Windows“服务”来重新启动它

为什么会出现这个问题?

priviledged=true摆脱 docker: 命令未找到问题

但是,docker:dind现在需要 TLS 证书(无论它们是什么)。如果您对较旧的 docker 版本感到满意,那么您可以使用选项 1。如果您想要最新版本,则需要设置 Gitlab CLI 来使用它们,这是选项 2。耶稣爱你:)

欲了解更多信息... https://about.gitlab.com/blog/2019/07/31/docker-in-docker-with-docker-19-dot-03


Hie*_* Vo 7

您需要选择一个包含 docker 二进制文件的图像

image: gitlab/dind

services:
  - docker:dind
Run Code Online (Sandbox Code Playgroud)

  • Gitlab/dind 已弃用(最后一次更新是在 5 年前)。应使用官方 docker dind 映像(仅称为“docker”) (9认同)

Kos*_*nos 6

这是一个非常适合我的完整示例:

Image-upload:
  image: docker:dind
  stage: Upload Docker Image
  variables:
    IMAGE_NAME: my.registry.site.com/${CI_PROJECT_PATH_SLUG}:$CI_COMMIT_SHA
  environment: dev
  only:
    - dev
  script:
    - echo Image name ${IMAGE_NAME}
    - docker build -t $IMAGE_NAME -f ./prod.dockerfile .
    - docker login my.registry.site.com --username $DOCKER_USER --password $DOCKER_PASS
    - docker push $IMAGE_NAME
  services:
    - docker:dind

Run Code Online (Sandbox Code Playgroud)

附言。您应该使用docker:dind而不是gitlab/dind获取最新的图像。


Oli*_*ade 2

这里的问题是节点 docker 映像没有嵌入 docker 二进制文件。

两种可能性:

  • 将阶段分为两项工作。一种使用节点映像进行质量和测试,一种使用 docker 映像进行构建和部署。请参阅职位文档

  • 构建一个嵌入节点和 docker 的自定义 docker 镜像,并使用该镜像构建您的存储库。

请注意,在这两种情况下,您都必须在代理内启用 docker。请参阅文档