将docker与gitlab ci集成-如何构建和使用docker映像?
我以前使用gitlab runner的shell来构建我的项目。到目前为止,我已经设置了管道,可以运行我在gitlab-ci.yml文件中设置的任何命令,如下所示: gitlab-ci.yml使用shell runner将docker与gitlab ci集成-如何构建和使用docker映像?,docker,gitlab,gitlab-ci,gitlab-ci-runner,Docker,Gitlab,Gitlab Ci,Gitlab Ci Runner,我以前使用gitlab runner的shell来构建我的项目。到目前为止,我已经设置了管道,可以运行我在gitlab-ci.yml文件中设置的任何命令,如下所示: gitlab-ci.yml使用shell runner before_script: - npm install - npm install --save @angular/material @angular/cdk cache: paths: - node_modules/ stages: - dev
before_script:
- npm install
- npm install --save @angular/material @angular/cdk
cache:
paths:
- node_modules/
stages:
- dev
- staging
- production
build_dev:
stage: dev
script:
- rm ./package-lock.json
- npm run build
- ./node_modules/@angular/cli/bin/ng test --browsers PhantomJS --watch false
image: node:8.10.0
before_script:
- npm install
- npm install --save @angular/material @angular/cdk
cache:
paths:
- node_modules/
stages:
- dev
- staging
- production
build_dev:
stage: dev
script:
- rm ./package-lock.json
- npm run build
- ./node_modules/@angular/cli/bin/ng test --browsers PhantomJS --watch false
现在,我想切换到docker图像。我已将runner重新配置为使用docker映像,并在新的gitlab-ci.yml文件中指定了该映像,如下所示。我遵循了gitlab ci docker教程,这是它结束的地方,因此我不完全确定从这里可以走到哪里:
gitlab-ci.yml使用docker runner
before_script:
- npm install
- npm install --save @angular/material @angular/cdk
cache:
paths:
- node_modules/
stages:
- dev
- staging
- production
build_dev:
stage: dev
script:
- rm ./package-lock.json
- npm run build
- ./node_modules/@angular/cli/bin/ng test --browsers PhantomJS --watch false
image: node:8.10.0
before_script:
- npm install
- npm install --save @angular/material @angular/cdk
cache:
paths:
- node_modules/
stages:
- dev
- staging
- production
build_dev:
stage: dev
script:
- rm ./package-lock.json
- npm run build
- ./node_modules/@angular/cli/bin/ng test --browsers PhantomJS --watch false
问题:
docker run
或docker exec
中包围gitlab-ci.yml文件中的所有命令?如果不包含这两个命令中的任何一个,它似乎只是在服务器上运行,而不是在docker映像中运行
image:node:8.10.0
的图像。在Dockerfile中,是否应指定相同的图像?我看过一些完全不同的项目,我想知道这两个图像的用途是什么/如果选择一个图像而不是另一个图像会严重影响我的构建
如果你想完全实现应用程序的dockerize,你必须采取不同的方法来构建你的应用程序。将有角度的内容导出到Dockerfile中,并在
.gitlab ci
中获取docker操作,而不是像下面这样有角度的内容:
stages:
- build
# - release
# - deploy
.build_template: &build_definition
stage: build
image: docker:17.06
services:
- docker:17.06-dind
script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker pull $CONTAINER_RELEASE_IMAGE || true
- docker build --cache-from $CONTAINER_RELEASE_IMAGE -t $CONTAINER_IMAGE -f $DOCKERFILE ./
- docker push $CONTAINER_IMAGE
build_app_job:
<<: *build_definition
variables:
CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/app:$CI_COMMIT_REF_SLUG
CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/app:latest
DOCKERFILE: ./Dockerfile.app
build_nginx_job:
<<: *build_definition
variables:
CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/nginx:$CI_COMMIT_REF_SLUG
CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/nginx:latest
DOCKERFILE: ./Dockerfile
现在,随着你的应用程序的构建,它可以通过网络服务器提供服务-这是你的选择,每个选择都有不同的配置-甚至不能在这里触及表面。这将在Dockerfile
中实现-我们公司通常使用Nginx
从现在开始,它是关于释放您的图像和部署它们。我只指定了如何在docker中构建它们,因为这似乎就是问题所在
如果您想部署映像并在某个地方运行—请选择一个提供商—AWS、Heroku、自己的基础架构—随您的便,但这太多了,无法在一个答案中涵盖所有这些内容,因此当您指定要在何处部署新构建的映像以及如何为其提供服务时,我将留待另一个问题。在我们的公司里,我们与Rancher合作,但市场上有多种令人敬畏且相互竞争的选择
编辑自定义注册表的 上述
.gitlab ci
配置仅适用于gitlab的“内部”注册表,如果您想使用自己的注册表,请相应地更改值:
#previous configs
script:
- docker login -u mysecretlogin -p mysecretpasswd registry.local.com
# further configs
- 从
到您在注册表中的登录-u gitlab ci token
- 从
到您的密码$CI\u JOB\u TOKEN
- 从
到您的注册表地址$CI_REGISTRY
CI secret variables
中,并通过env变量引用,以便它们不会保存在存储库中
最后,如果您决定保护这些值,您的脚本可能如下所示。请参阅Gitlab的-超级简单任务
#previous configs
script:
- docker login -u $registrylogin -p $registrypasswd $registryaddress
# further configs
经过多次尝试和阅读另一个教程后,我遇到了运行此命令的问题:
-docker login-u gitlab ci token-p$ci\u JOB\u token$ci\u REGISTRY
。它建议我使用--password stdin
,但使用它的唯一方法是从这样的文件中输入密码:cat~/my_password.txt | docker login--username foo--password stdin
。有没有办法通过gitlab的“秘密变量”部分使用加密密码?只是为了澄清-您没有使用gitlab的注册表?在我提出这个问题后,我设置了自己的本地注册表。因此,当我运行这个命令时,它会说:$docker login-u gitlab ci token--password stdin$ci\u JOB\u token$ci\u registry“docker login”最多需要1个参数。
上述方法仅适用于gitlab的注册表,如果您想使用自己的注册表,请相应地将值从gitlab ci token更改为您在注册表中的登录名,$CI_JOB_TOKEN
到您的密码和$CI_REGISTRY
到您的注册表公共地址-它们应该存储在gitlab的机密中,并通过env变量引用,这样它们就不会保存在存储库中。如果不清楚,我可以用它更新。