如何在gitlab-ci.yml中将文件从存储库复制到用于作业的docker容器中

时间:2018-10-06 12:47:02

标签: docker gitlab gitlab-ci

如何使用gitlab-ci作业将项目中的文件添加到Docker中。假设我的.gitlab-ci.yml中有未完成的工作。

build:master:
  image: ubuntu:latest
  script:
    - cp sample.txt /sample.txt
  stage: build
  only:
    - master

如何在ubuntu图片中复制sample.txt?我在想,因为它已经是一个正在运行的容器,所以我们不能直接执行复制命令,而必须运行

docker cp sample.txt mycontainerID:/sample.txt

但是我又如何获得mycontainerID?因为它将在gitlab运行程序中运行,并且每次运行都会分配任何随机ID。我的假设是错误的吗?请建议

2 个答案:

答案 0 :(得分:3)

该文件已经在容器内部。如果您仔细阅读CI / CD构建日志,则在拉动映像并启动它之后,您将在最上方看到,您的存储库将克隆到正在运行的容器中。

您可以在 / builds / organization / repository
下找到它 (请注意,这些是变量,您必须调整以适应实际的组织和名称)
或使用变量 $ CI_PROJECT_DIR

实际上是开始作业时所在的目录“您”。

例如,来自存储库https://gitlab.com/bluebrown/gitlab-ci-playground的.gitlab-ci.yml

<a href="/" *ngIf="!rowNode.node.children">{{rowData.name}}</a>
<span *ngIf="rowNode.node.children">{{rowData.name}}</span>

返回以下管道输出: enter image description here 如您所见,我可以在容器内打印出README.md的内容。

答案 1 :(得分:-1)

您的跑步者已经在您的Docker容器中执行script。 您在这里所做的工作是:

  • 使用Ubuntu映像启动容器,然后将Git项目挂载到 那里。
  • cp sample.txt从Git项目的根目录到容器的
  • 停止容器说“工作已完成”

这基本上就是image的意思:使用此docker镜像启动一个容器,该容器将执行脚本部分中列出的命令。

我不确定您要达到的目标。如果是构建工作,那么为什么不真正从Dockerfile中复制文件并配置您的工作以使用docker build进行构建呢?一个运行docker build -t your/image:latest -f build/Dockerfile .的Runner shell执行程序就可以了。然后,将该映像推送到某些Docker注册表中(例如,Gitlab或Docker Hub)。

如果您的目标确实更复杂,并且您只想向正在运行的容器中添加文件,则可以使用相同的Runner(使用shell执行程序,而不是docker executor,因此不需要image)并运行像

- docker run --name YOUR_CONTAINER_NAME -v $PWD:/mnt ubuntu:latest cp /mnt/sample.txt /sample.txt
- docker commit -m "Commit Message" -a "You" YOUR_CONTAINER_NAME your/image:latest
- docker push your/image:latest
- docker rm YOUR_CONTAINER_NAME

注意:我不是100%肯定第一个会工作,但这是从容器中创建映像的一般想法,如果您真的可以的话,不依赖实际的Dockerfile'用Dockerfile实现您的目标。