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。我的假设是错误的吗?
该文件已经在容器内。如果您仔细阅读 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 容器中执行。你在这里的工作是:
这基本上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 的一般想法。