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

问题描述 投票:1回答:2

如何在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。我的假设是错的吗?请建议

docker gitlab gitlab-ci
2个回答
3
投票

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

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

实际上,这是启动作业时“你”所在的目录。

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

image: alpine

test:
  script:
    - echo "the project directory is - $CI_PROJECT_DIR"
    - cat $CI_PROJECT_DIR/README.md ; echo
    - echo "and where am I? - $PWD"

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


-1
投票

你的跑步者已经在你的码头工人容器中执行script。你的工作在这里做的是:

  • 使用Ubuntu映像启动一个容器并在那里挂载你的Git项目。
  • 从Git项目根到容器的cp sample.txt
  • 停止容器说“完成工作”

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

我并不完全明白你想要实现的目标。如果它是一个构建作业,那么为什么不实际从Dockerfile中复制文件并配置你的作业以使用docker build构建它?执行docker build -t your/image:latest -f build/Dockerfile .的Runner shell执行程序会很好。然后在一些Docker注册表(例如Gitlab或Docker Hub)中推送此图像。

如果真的你的目标更复杂并且你只想将文件添加到正在运行的容器中,你可以使用相同的Runner(使用shell执行器,而不是docker,所以没有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实现你的目标。

© www.soinside.com 2019 - 2024. All rights reserved.