gitlab-runner - docker(dind)中的docker并推送到GitLab注册表

时间:2018-02-08 03:05:38

标签: laravel laravel-5 dockerfile gitlab-ci-runner

我希望使用GitLab Container Registry临时存储我新建的Docker镜像;为了拥有Docker功能(即docker登录,docker build,docker push),我应用了docker-in-docker executor;然后从GitLab Piplelines错误消息,我意识到我需要在项目根目录下放置一个Dockerfile: -

$ docker build --pull -t $CONTAINER_TEST_IMAGE .
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /builds/xxxxx.com/laravel/Dockerfile: no such file or directory

我的Dockerfile包括centos:7,php,nodejs,composer和sass安装。我观察每次提交后,GitLab运行器将通过Dockerfile一次并从头开始安装所有这些,这使整个构建阶段非常缓慢和有趣 - 为什么我只想在我的项目中修改1个单词但我需要安装如此多的事情再次部署?

从我的想象中,如果我可以从Dockerfile预先构建一个Docker镜像,包含上面提到的安装和Docker(以便docker登录,docker build和docker push可以工作)并存储在GitLab中,那将会很好-runner服务器,每次提交后,可以重用此映像来构建要推送到GitLab容器注册表的新映像。

然而,我遇到了两个问题: -

1)即使我在预构建Docker镜像中包含Docker安装,我也无法通过systemctl docker启动,因为一些D-bus问题

Failed to get D-Bus connection: Operation not permitted

另外一些文章还提到容器中的docker不应该运行后台服务;

2)当我使用dind时,它需要在项目根目录下使用Dockerfile;预先构建一个Docker镜像,实际上我与项目根目录下的Dockerfile无关;因此是一个错误的选择?

实际上,将Laravel项目图像推送到GitLab Container Registry的正确方法是什么? (在哪里放置那些npm install和composer install命令?)

image: docker:latest
services:
- docker:dind

stages:
  - build
  - test
  - deploy

variables:
  CONTAINER_TEST_IMAGE: xxxx
  CONTAINER_RELEASE_IMAGE: yyyy

before_script:  
  - docker login -u xxx -p yyy registry.gitlab.com 

build:
  stage: build
  script:
    - npm install here?
    - docker build --pull -t $CONTAINER_TEST_IMAGE .
    - docker push $CONTAINER_TEST_IMAGE

1 个答案:

答案 0 :(得分:0)

您的帖子中有很多问题。我想针对他们如下:

  1. 您可以预先构建docker映像,然后在gitlab-ci.yaml文件中使用它。这可以用来添加您的特定依赖项。

    image: my custom image
    services:
     - docker:dind
    

    将服务添加到配置中的重要性。

  2. 您遇到有关尝试在gitlab-ci.yml内部运行docker服务的问题。您实际上不需要这样做。 Gitlab将docker引擎公开给执行程序(通过unix:///var/run/docker.socktcp://localhost:2375/)。请注意,如果运行程序在kubernetes环境中执行,则需要指定DOCKER_HOST,如下所示:

    variable:
       DOCKER_HOST: tcp://localhost:2375/
    
  3. 您对npm install的放置位置的疑问是关于如何构建docker映像的一个基本问题。简而言之,npm install应该放在Dockerfile中。有关详细说明,请以this为例。

一些参考文献: