我希望使用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
答案 0 :(得分:0)
您的帖子中有很多问题。我想针对他们如下:
您可以预先构建docker映像,然后在gitlab-ci.yaml
文件中使用它。这可以用来添加您的特定依赖项。
image: my custom image
services:
- docker:dind
将服务添加到配置中的重要性。
您遇到有关尝试在gitlab-ci.yml
内部运行docker服务的问题。您实际上不需要这样做。 Gitlab将docker引擎公开给执行程序(通过unix:///var/run/docker.sock
或tcp://localhost:2375/
)。请注意,如果运行程序在kubernetes环境中执行,则需要指定DOCKER_HOST
,如下所示:
variable:
DOCKER_HOST: tcp://localhost:2375/
您对npm install
的放置位置的疑问是关于如何构建docker映像的一个基本问题。简而言之,npm install
应该放在Dockerfile
中。有关详细说明,请以this为例。
一些参考文献: