如何将存储库中的文件复制到用于作业的 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
。
你在这里的工作是:
这基本上就是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)策略