在 Gitlab CI 中构建多个 docker 图像
Build multiple docker images in Gitlab CI
我想从 2 个不同的文件夹创建 2 个不同的 Docker 图片。
我的 repo 具有以下结构:
.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 构建 context 不是应用程序文件夹,而是整个存储库的根目录,因此包含所有应用程序的代码。
测试作业 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 build reference有没有这方面的相关内容,但是没查到。
使用构建上下文时唯一提到的异常是:
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 构建命令执行完全相同的操作。他们都使用调试文件的内容而不是寻找 Docker 文件,并将使用 /home/me/myapp 作为构建上下文的根。请注意,调试位于构建上下文的目录结构中,无论您在命令行中如何引用它。
欢迎提出任何建议!
我认为此解决方案与 Docker 构建完全无关。看看你的测试node app job
。您在用于克隆整个存储库的文件夹中执行 运行ning ls
命令。所以事实上你是 运行ning ls
在你的图像中,在包含你的 repo 内容的文件夹中。
这是 GitLab CI 作业的默认行为。它会将您的存储库克隆到新创建的文件夹,这就是您看到此输出的原因。尝试使用 GIT_STRATEGY: none
变量为您的两个测试作业禁用它或尝试 运行 ls /somewhereelse
.
如果你想 运行 你的测试命令 node/php 图像的内容,最好从作业中删除 image:
并 运行 它在默认管道图像上为 docker run $CI_REGISTRY_IMAGE/$CONTAINER_NAME:latest run test scripts
我想从 2 个不同的文件夹创建 2 个不同的 Docker 图片。
我的 repo 具有以下结构:
.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 构建 context 不是应用程序文件夹,而是整个存储库的根目录,因此包含所有应用程序的代码。
测试作业 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 build reference有没有这方面的相关内容,但是没查到。 使用构建上下文时唯一提到的异常是:
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 构建命令执行完全相同的操作。他们都使用调试文件的内容而不是寻找 Docker 文件,并将使用 /home/me/myapp 作为构建上下文的根。请注意,调试位于构建上下文的目录结构中,无论您在命令行中如何引用它。
欢迎提出任何建议!
我认为此解决方案与 Docker 构建完全无关。看看你的测试node app job
。您在用于克隆整个存储库的文件夹中执行 运行ning ls
命令。所以事实上你是 运行ning ls
在你的图像中,在包含你的 repo 内容的文件夹中。
这是 GitLab CI 作业的默认行为。它会将您的存储库克隆到新创建的文件夹,这就是您看到此输出的原因。尝试使用 GIT_STRATEGY: none
变量为您的两个测试作业禁用它或尝试 运行 ls /somewhereelse
.
如果你想 运行 你的测试命令 node/php 图像的内容,最好从作业中删除 image:
并 运行 它在默认管道图像上为 docker run $CI_REGISTRY_IMAGE/$CONTAINER_NAME:latest run test scripts