在 Gitlab CI 中构建多个 docker 镜像

瑞克

我想从 2 个不同的文件夹创建 2 个不同的 Docker 图像。

我的回购具有以下结构:

.gitlab-ci.yml
node_app/
   src/
   package.json
   Dockerfile
php_app/
   src/
   composer.json
   Dockerfile

我有以下代码 .gitlab-ci.yml

image: docker:stable
services:
  - docker:dind

stages:
  - build
  - test

variables:
  DOCKER_HOST: tcp://docker:2375
  DOCKER_DRIVER: overlay2

before_script:
  - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY

.build:
  stage: build
  script:
    - |

      IMAGE_TAGGED=$CI_REGISTRY_IMAGE/$CONTAINER_NAME:$CI_COMMIT_REF_SLUG
      IMAGE_LATEST=$CI_REGISTRY_IMAGE/$CONTAINER_NAME:latest

      docker build \
        --pull \
        --tag $IMAGE_TAGGED \
        --tag $IMAGE_LATEST \
        --file $CONTAINER_NAME/Dockerfile \
        $CONTAINER_NAME

      docker push $IMAGE_TAGGED
      docker push $IMAGE_LATEST

build node app:
  extends: .build
  variables:
    CONTAINER_NAME: "node_app"

build php app:
  extends: .build
  variables:
    CONTAINER_NAME: "php_app"

.test:
  before_script:
    - echo 'testing app'
  image: $CI_REGISTRY_IMAGE/$CONTAINER_NAME:$CI_COMMIT_REF_SLUG
  stage: test

test node app:
  extends: .test
  variables:
    CONTAINER_NAME: "node_app"
  script:
    - ls -la
#    - run test scripts

test php app:
  extends: .test
  variables:
    CONTAINER_NAME: "php_app"
  script:
    - ls -la
#    - run test scripts

问题在于 docker 构建上下文不是应用程序文件夹,而是整个存储库的根,因此包含所有应用程序的代码。

测试作业ls -la命令的结果是:

total 40
drwxrwxrwx    7 root     root          4096 Aug  6 08:46 .
drwxrwxrwx    4 root     root          4096 Aug  6 08:46 ..
drwxrwxrwx    6 root     root          4096 Aug  6 08:46 .git
-rw-rw-rw-    1 root     root             6 Aug  6 08:46 .gitignore
drwxrwxrwx    2 root     root          4096 Aug  6 08:46 .gitlab
-rw-rw-rw-    1 root     root          5705 Aug  6 08:46 .gitlab-ci.yml
drwxrwxrwx    3 root     root          4096 Aug  6 08:46 .idea
drwxrwxrwx    7 root     root          4096 Aug  6 08:46 node_app
drwxrwxrwx    3 root     root          4096 Aug  6 08:46 php_app

如果我在本地运行完全相同的 docker 命令,则图像构建得很好,具有正确的构建上下文。但是,在 Gitlab Runner 中,构建上下文似乎没有做任何事情。

如果有任何与此相关的内容,我已经检查了官方的Docker 构建参考,但我找不到任何内容。使用构建上下文时唯一提到的异常是:


You cannot specify the build-context directory (myfolder in the examples above) when using BuildKit as builder (DOCKER_BUILDKIT=1). Support for this feature is tracked in buildkit#1684.

但我没有使用那个变量,Gitlab 也没有设置它。

此外,官方 Docker 参考给出了这个例子:

$ cd /home/me/myapp/some/dir/really/deep
$ docker build -f /home/me/myapp/dockerfiles/debug /home/me/myapp
$ docker build -f ../../../../dockerfiles/debug /home/me/myapp

这两个 docker build 命令执行完全相同的操作。它们都使用调试文件的内容而不是查找 Dockerfile,并将使用 /home/me/myapp 作为构建上下文的根。请注意,调试位于构建上下文的目录结构中,无论您在命令行中如何引用它。

欢迎任何建议!

岑德

我认为这个解决方案根本与 Docker 构建无关。看看你的测试node app job您正在ls用于克隆整个存储库的文件夹中运行命令。因此,事实上您正在ls图像中运行,在包含存储库内容的文件夹中。

这是 GitLab CI 作业的默认行为。它会将您的 repo 克隆到新创建的文件夹,这就是您看到此输出的原因。尝试使用GIT_STRATEGY: none变量为您的两个测试作业禁用它或尝试运行ls /somewhereelse.

如果您想对 node/php 图像的内容运行测试命令,最好image:从作业中删除并在默认管道图像上运行它docker run $CI_REGISTRY_IMAGE/$CONTAINER_NAME:latest run test scripts

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章