gpt4 book ai didi

docker - 将 docker 与 gitlab-ci 集成——如何构建和使用 docker 镜像?

转载 作者:行者123 更新时间:2023-12-02 18:14:55 26 4
gpt4 key购买 nike

我之前使用 gitlab runner 的 shell 来构建我的项目。到目前为止,我已经设置了管道,它将运行我在如下所示的 gitlab-ci.yml 文件中设置的任何命令:

gitlab-ci.yml 使用 shell runner

before_script:
- npm install
- npm install --save @angular/material @angular/cdk

cache:
paths:
- node_modules/

stages:
- dev
- staging
- production

build_dev:
stage: dev

script:
- rm ./package-lock.json
- npm run build
- ./node_modules/@angular/cli/bin/ng test --browsers PhantomJS --watch false

现在,我想切换到 docker 镜像。我已重新配置运行程序以使用 docker 图像,并在如下所示的新 gitlab-ci.yml 文件中指定了该图像。我遵循了 gitlab-ci docker 教程,这是它停止的地方,所以我不完全确定从这里去哪里:

gitlab-ci.yml 使用 docker runner

image: node:8.10.0

before_script:
- npm install
- npm install --save @angular/material @angular/cdk

cache:
paths:
- node_modules/

stages:
- dev
- staging
- production

build_dev:
stage: dev

script:
- rm ./package-lock.json
- npm run build
- ./node_modules/@angular/cli/bin/ng test --browsers PhantomJS --watch false

问题:

  1. 使用我当前的 gitlab-ci.yml 文件,这如何构建一个 docker 镜像/它甚至可以构建一个吗?如果是,那是什么意思?目前管道通过了,但我不知道它是否在 docker 镜像中通过了(我应该能够分辨出来吗?)。

    另外,假设 docker 镜像已创建,运行测试,管道通过;它应该将代码推送到新的存储库(尚未包含在 yml 文件中)。从我收集到的信息来看,图像没有被推送,它只是代码,对吧?那么我该如何处理这个创建的 docker 镜像呢?

  2. 如何使用 Dockerfile?我看不到 gitlab-ci.yml 文件和 Dockerfile 之间的链接。

  3. 我是否需要将gitlab-ci.yml 文件中的所有命令包围在docker run <commands> 中?或 docker exec <commands> ?如果不包含这两个命令之一,它似乎只会在服务器上运行,而不是在 docker 镜像中运行。

  4. 我见过有人在 gitlab-ci.yml 文件和 Dockerfile 中指定一个图像。我有一个角度项目,我指定了 image: node:8.10.0 的图像.在 Dockerfile 中,我应该指定相同的图像吗?我见过一些完全不同的项目,我想知道这两个图像的用途是什么/如果选择一个图像而不是另一个图像会严重影响我的构建。

最佳答案

如果你想完全 docker 化它,你必须采取不同的方法来构建你的应用程序。将有角度的东西导出到 Dockerfile 并在 .gitlab-ci 中获取 docker 操作,而不是像这里这样的有角度的东西:

stages:
- build
# - release
# - deploy

.build_template: &build_definition
stage: build
image: docker:17.06
services:
- docker:17.06-dind
script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker pull $CONTAINER_RELEASE_IMAGE || true
- docker build --cache-from $CONTAINER_RELEASE_IMAGE -t $CONTAINER_IMAGE -f $DOCKERFILE ./
- docker push $CONTAINER_IMAGE

build_app_job:
<<: *build_definition
variables:
CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/app:$CI_COMMIT_REF_SLUG
CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/app:latest
DOCKERFILE: ./Dockerfile.app

build_nginx_job:
<<: *build_definition
variables:
CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/nginx:$CI_COMMIT_REF_SLUG
CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/nginx:latest
DOCKERFILE: ./Dockerfile

您可以设置一些构建作业 - 用于生产、开发、暂存等。在您的 .gitlab-ci.yaml 旁边,您可以放置​​ DockerfileDockerfile.app - Dockerfile.app 代表构建您的角度应用程序:

FROM node:10.5.0-stretch
RUN mkdir -p /usr/src/app
RUN mkdir -p /usr/src/remote
WORKDIR /usr/src/app
COPY . .
# do your commands here

现在您的应用程序已构建,可以通过网络服务器提供服务 - 这是您的选择,每个选择都会有不同的配置 - 这里甚至不能触及表面。这将在 Dockerfile 中实现 - 我们通常在我们公司使用 Nginx。

从这里开始,就是发布您的图像并部署它们。我只指定了如何在 docker 中构建它们,因为这似乎就是问题所在。

如果您想部署您的图像并在某个地方运行它 - 选择一个提供商 - AWS、Heroku、自己的基础设施 - 随心所欲,但这太多了,无法在一个答案中涵盖所有这些,所以我会离开当您指定要在哪里部署新构建的图像以及如何提供服务时,它会成为另一个问题。在我们公司,我们使用 Rancher 进行协调,但市场上有多种很棒且相互竞争的选择。


编辑自定义注册表

上面的 .gitlab-ci 配置仅适用于 Gitlab 的“内部”注册表,如果您想使用自己的注册表,请相应地更改值:

#previous configs
script:
- docker login -u mysecretlogin -p mysecretpasswd registry.local.com
# further configs
  • -u gitlab-ci-token 到您在注册表中的登录,
  • $CI_JOB_TOKEN 到您的密码
  • $CI_REGISTRY 到您的注册表地址

这些值应该存储在 Gitlab 的 CI secret variables 中,并通过 env 变量引用,这样它们就不会保存在存储库中。

最后,如果您决定保护这些值,您的脚本可能如下所示。引用Gitlab的official docs on how to add secret CI variables - super 简单的任务。

#previous configs
script:
- docker login -u $registrylogin -p $registrypasswd $registryaddress
# further configs

关于docker - 将 docker 与 gitlab-ci 集成——如何构建和使用 docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51194769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com