GitLab CD将Docker应用部署到暂存和生产中的工作流

GitLab CD将Docker应用部署到暂存和生产中的工作流,docker,docker-compose,gitlab,gitlab-ci,Docker,Docker Compose,Gitlab,Gitlab Ci,我最近设置了GitLab(13.4.3-ee)CI/CD来构建和部署Docker 集装箱投入生产。这很好,但我想添加一个舞台 尽管读了很多书,但我似乎无法找到一个可行的方法 这样做的方式 我认为我的问题之一是,在学习教程之后,我依赖于 docker编写要部署到生产中的文件 如果我添加了一个步骤来部署到另一个(暂存)运行程序,那么映像: 我在生产中使用的语句没有用处,因为它安装了最新版本 形象。我真的不想在docker图像上使用latest标记,除非我 即将将该映像部署到生产环境中 我考虑将部署阶

我最近设置了GitLab(13.4.3-ee)CI/CD来构建和部署Docker 集装箱投入生产。这很好,但我想添加一个舞台 尽管读了很多书,但我似乎无法找到一个可行的方法 这样做的方式

我认为我的问题之一是,在学习教程之后,我依赖于 docker编写要部署到生产中的文件

如果我添加了一个步骤来部署到另一个(暂存)运行程序,那么
映像:
我在生产中使用的语句没有用处,因为它安装了
最新版本
形象。我真的不想在docker图像上使用
latest
标记,除非我 即将将该映像部署到生产环境中

我考虑将部署阶段中的docker compose命令替换为 复制compose文件的一系列手动步骤,但这看起来很混乱, 尤其是当应用程序依赖于其他容器时

对我应该如何处理这个问题有什么建议吗

.gitlab-ci.yml
阶段:
-建造
-部署
#构建和标记:主图像和:最新图像(如果在主分支上)
构建主节点:
#码头工人的官方形象。
图片:docker:19.03.12-dind
阶段:建造
服务:
-码头工人:19.03.12-dind
在脚本之前:
-docker登录-u$CI\u注册表\u用户-p$CI\u注册表\u密码$CI\u注册表
脚本:
-echo$CI\u注册表\u图像
-docker build——pull-t$CI\u REGISTRY\u IMAGE:latest。
-docker push$CI\u注册表\u图像
#仅在主分支上运行此作业。
仅:
-主人
构建测试:
#码头工人的官方形象。
图片:docker:19.03.12-dind
阶段:建造
服务:
-码头工人:19.03.12-dind
在脚本之前:
-docker登录-u$CI\u注册表\u用户-p$CI\u注册表\u密码$CI\u注册表
脚本:
-echo$CI\u注册表\u图像
-docker build——pull-t$CI\u REGISTRY\u IMAGE:$CI\u COMMIT\u REF\u NAME。
-docker push$CI\u注册表\u映像:$CI\u提交\u引用\u名称
#不要在主分支上运行作业
除:
-主人
部署产品:
阶段:部署
#指定流道
标签:
-刺激
在脚本之前:
-docker登录-u$CI\u注册表\u用户-p$CI\u注册表\u密码$CI\u注册表
脚本:
#在制作中,拉取最新的图像。
-docker pull$CI\u注册表\u图像:最新
-码头工人放下
-docker compose up-d
时间:手动
仅:
-主人
docker-compose.yml 请注意,这是实际docker compose文件的一个精简版本

---
版本:“3”
服务:
buildit:
图片:我的gitlab注册表。本地:5050/app/docker构建测试:最新
容器名称:docker构建测试
端口:
- 500:80

您可以使用环境变量选择图像标签。在docker compose中,您可以这样做

---
version: '3'

services:
    buildit:
        image: my-gitlab-registry.local:5050/app/docker-build-test:${IMAGE_TAG:-latest} #latest is a default value
        container_name: docker-build-test
        ports:
            - 500:80
在gitlab ci中

  • build\u master
    期间,您可以推送多个标记
  • deploy\u prod
    期间,您可以设置IMAGE\u TAG=master
  • deploy\u staging
    期间,您可以设置IMAGE\u TAG=staging

这样可以避免拉取最新的图像,也可以拉取特定标签上的最新图像。可以使用环境变量选择图像标签。在docker compose中,您可以这样做

---
version: '3'

services:
    buildit:
        image: my-gitlab-registry.local:5050/app/docker-build-test:${IMAGE_TAG:-latest} #latest is a default value
        container_name: docker-build-test
        ports:
            - 500:80
在gitlab ci中

  • build\u master
    期间,您可以推送多个标记
  • deploy\u prod
    期间,您可以设置IMAGE\u TAG=master
  • deploy\u staging
    期间,您可以设置IMAGE\u TAG=staging

通过这种方式,您可以避免拉取
最新的
图像,并且可以拉取特定标签上的最新图像

您可能根本不想使用
最新的
标签。为每个构建创建一个唯一的版本标记,并将其(可能通过环境变量)注入
docker compose.yml
文件。这避免了系统认为它是最新的问题,因为它正在运行一些“最新”的构建,即使它是昨天的“最新”。您可能根本不想使用
latest
标记。为每个构建创建一个唯一的版本标记,并将其(可能通过环境变量)注入
docker compose.yml
文件。这避免了系统认为它是最新的问题,因为它运行的是一些“最新”的构建,即使它是昨天的“最新”。谢谢,这让我有一些想法。虽然我不确定您是否打算使用
environment
关键字,如果您打算设置一个环境变量,因为它似乎是不同的(),但我认为它的语法如下,尽管environment关键字似乎确实适合于我要做的事情,但我真的不知道如何在我的案例中应用它<代码>yaml变量:IMAGE_标记:staging很抱歉我犯了一个错误<代码>环境事件在gitlab ci中无效。无论如何,您可以通过在脚本中设置环境变量来使用相同的方法。谢谢,这给了我一些思考。虽然我不确定您是否打算使用
environment
关键字,如果您打算设置一个环境变量,因为它似乎是不同的(),但我认为它的语法如下,尽管environment关键字似乎确实适合于我要做的事情,但我真的不知道如何在我的案例中应用它<代码>yaml变量:IMAGE_标记:staging很抱歉我犯了一个错误<代码>环境事件在gitlab ci中无效。无论如何,您可以通过在脚本中设置环境变量来使用相同的方法