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

Posted

技术标签:

【中文标题】如何将存储库中的文件复制到用于作业的 Docker 容器中,在 gitlab-ci.yml【英文标题】:How to copy a file from the repository, into the Docker container used for a job, in gitlab-ci.yml 【发布时间】:2019-03-11 18:22:37 【问题描述】:

如何使用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。我的假设是错误的吗?

【问题讨论】:

您可以为 build/test/general helper flies(您需要的)创建一个 git 存储库,并将其克隆为脚本的第一阶段。我也相信这会产生更好的可重复结果 【参考方案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 执行器,所以没有 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 的一般想法' t 用 Dockerfile 实现你的目标。

【讨论】:

【参考方案2】:

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

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

其实就是开始工作时“你”所在的目录。

例如这个.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"

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

【讨论】:

【参考方案3】:

我们不需要复制。存储库文件将在映像中可用。 GitLab 为我们做到了。

键入以使用ls(linux) or dir(windows) 命令,具体取决于您的平台来列出文件和文件夹。

【讨论】:

以上是关于如何将存储库中的文件复制到用于作业的 Docker 容器中,在 gitlab-ci.yml的主要内容,如果未能解决你的问题,请参考以下文章

云计算核心技术Docker教程:Docker存储写入时复制(CoW)策略

如何将文件从一个文件夹移动到同一git存储库中的另一个文件夹保留历史记录[重复]

如何仅删除远程存储库中的文件? [复制]

如何将外部文件添加到 Jenkins 作业?

从 SVN 存储库中删除文件而不删除本地副本

docker存储驱动