在gitlab CI中拉/运的docker镜头会发生什么?

时间:2017-10-03 06:50:52

标签: docker gitlab gitlab-ci

我在使用gitlab CI构建时遇到了奇怪的问题。

我的脚本看起来像这样:

 - docker pull myrepo:myimage
 - docker tag myrepo:myimage myimage
 - docker run --name myimage myimage

它已经工作了几次,但之后我开始收到错误:

  

docker:来自守护程序的错误响应:冲突。容器名称   " / MYIMAGE"容器已经在使用....

我已登录执行该步骤的特定计算机,docker ps -a已显示该图像已保留在构建计算机上...

我预计gitlab CI构建步骤通过在docker容器中运行它们与外部环境完全分离......这样构建就不会破坏'其他构建的环境。因此,我预计CI构建的所有图像和容器都会简单地消亡......事实并非如此......

我的gitlab在某种程度上是错误配置的,或者这是预期的行为,docker images / containers存在于主机的上下文中而不是在docker镜像中?

在我的构建中,我使用了图片docker:latest

2 个答案:

答案 0 :(得分:1)

不,你的Gitlab没有配置错误。 Gitlab会清理其运行程序和执行程序(运行命令的docker镜像)。

由于您使用的是DinD(Docker-in-Docker),您启动或构建的任何容器实际上都是在同一主机上构建并运行在您的作业执行程序容器之外,而不是“内部”容器。

因此你应该清理,Gitlab不知道你在工作中做了什么,所以它不负责。

我使用您描述的相同情况运行各种管道,因此提出了一些建议:

 job:
   script:
   - docker pull myrepo:myimage
   - docker tag myrepo:myimage myimage
   - docker run --name myimage myimage
   after_script:
   # Stop any running containers, if they are not running anymore (since its not a run -d), ignore errors about that.
   - docker rm -f myrepo:myimage myimage || true
   # Remove pulled images
   - docker rmi -f myrepo:myimage image

另外(我当然不知道你的确切工作)这可能会更短:

 job:
   script:
   # Only pull if you want to 'refresh' any images that would be left behind
   - docker pull myrepo:myimage
   - docker run --name myimage myrepo:myimage
   after_script:
   # Stop any running containers, if they are not running anymore (since its not a run -d), ignore errors about that.
   - docker rm -f myrepo:myimage || true
   # Remove pulled image
   - docker rmi -f myrepo:myimage

答案 1 :(得分:0)

问题是,/var/run/docker.sock被映射为卷,导致所有docker命令在主机上调用,而不是在图像内部。这本身并不是错误配置,但另一种方法是使用dind服务:https://docs.gitlab.com/ce/ci/docker/using_docker_build.html#use-docker-in-docker-executor

这需要做三件事:

  1. 将以下部分添加到gitlab ci config:
  2. services:
     - docker:dind
    
    1. 在ci配置中定义变量DOCKER_DRIVER: overlay2,或在config.toml

    2. 中全局定义变量overlay
    3. 加载内核模块/etc/modulesfrom pyspark.sql.functions import udf from pyspark.sql.functions import * def example(lista): d = [[] for x in range(len(lista))] for index, elem in enumerate(lista): d[index] = elem.split("@") return d example_udf = udf(example, LongType()) a = [[u'PNR1',u'TKT1',u'TEST',u'a2',u'a3'],[u'PNR1',u'TKT1',u'TEST',u'a5',u'a6'],[u'PNR1',u'TKT1',u'TEST',u'a8',u'a9']] rdd= sc.parallelize (a) df = rdd.toDF(["col1","col2","col3","col4","col5"]) df2=df.withColumn('col6', concat(col('col4'),lit('@'),col('col5'))).drop(col("col4")).drop(col("col5")).groupBy([col("col1"),col("col2"),col("col3")]).agg(collect_set(col("col6")).alias("col6")) df2.map(lambda x: (x[0],x[1],x[2],example(x[3]))).collect()