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

gam*_*r17 7 gitlab docker gitlab-ci

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

build:master:
  image: ubuntu:latest
  script:
    - cp sample.txt /sample.txt
  stage: build
  only:
    - master
Run Code Online (Sandbox Code Playgroud)

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

docker cp sample.txt mycontainerID:/sample.txt
Run Code Online (Sandbox Code Playgroud)

但我将如何获得 mycontainerID ?因为它将在 Gitlab runner 中运行,并且每次运行都会分配任何随机 id。我的假设是错误的吗?

The*_*ool 9

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

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

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

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

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"
Run Code Online (Sandbox Code Playgroud)

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


小智 -4

您的运行程序已经script在您的 docker 容器中执行。你在这里的工作是:

  • 使用 Ubuntu 镜像启动一个容器并在其中挂载您的 Git 项目。
  • 将 example.txt 从 Git 项目的根目录复制到容器的根目录
  • 停止容器说“工作完成”

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

我不太明白你想要实现什么目标。如果这是一个构建作业,那么为什么不从 Dockerfile 中实际复制文件并配置您的作业来构建它呢docker build?Runner shell 执行器这样做docker build -t your/image:latest -f build/Dockerfile .就可以了。然后将此映像推送到某个 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
Run Code Online (Sandbox Code Playgroud)

注意:我不是 100% 确定第一个可以工作,但是如果您确实无法使用 Dockerfile 实现您的目标,那么这将是从容器创建映像而不依赖实际 Dockerfile 的一般想法。