用于在 AWS EC2 中构建和部署 docker 映像的 CI/CD 脚本

     2023-02-19     130

关键词:

【中文标题】用于在 AWS EC2 中构建和部署 docker 映像的 CI/CD 脚本【英文标题】:CI/CD script for build & deploy docker image in aws EC2 【发布时间】:2021-12-08 11:06:45 【问题描述】:

我可以使用此 CI/CD 配置构建、推送(到 gitlab 注册表)和部署映像(到 aws EC2)吗?

stages:
  - build
  - deploy

build:
  # Use the official docker image.

  image: docker:latest
  stage: build
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  # Default branch leaves tag empty (= latest tag)
  # All other branches are tagged with the escaped branch name (commit ref slug)
  script:
    - |
      if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
        tag=""
        echo "Running on default branch '$CI_DEFAULT_BRANCH': tag = 'latest'"
      else
        tag=":$CI_COMMIT_REF_SLUG"
        echo "Running on branch '$CI_COMMIT_BRANCH': tag = $tag"
      fi
    - docker build --pull -t "$CI_REGISTRY_IMAGE$tag" .
    - docker push "$CI_REGISTRY_IMAGE$tag"
  # Run this job in a branch where a Dockerfile exists

deploy:
  stage: deploy
  before_script:
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
  script:
    - ssh -o StrictHostKeyChecking=no ubuntu@18.0.0.82 "sudo docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY; sudo docker pull $CI_REGISTRY_IMAGE$tag; cd /home/crud_app; sudo docker-compose up -d"
  after_script:
    - sudo docker logout

  rules:
    - if: $CI_COMMIT_BRANCH
      exists:
        - Dockerfile

脚本构建成功后,部署失败。

(构建成功)

(部署失败)

必须构建配置并部署映像

【问题讨论】:

该行出错:echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - 关于最后一个错误,在“脚本后”中,它说没有找到sudo。您是否尝试将其从 sudo docker logout 中删除? 【参考方案1】:

有几个错误,但整体管道看起来不错。

    您不能在没有运行代理的情况下使用ssh-add 如果之后您明确忽略将存储在known_hosts 下的密钥,为什么还要手动创建 .ssh 文件夹? 使用StrictHostKeyChecking=no 很危险,完全不推荐。

before_script 上添加以下内容:

before_script:
    - eval `ssh-agent`
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - ssh-keyscan -H 18.0.0.82 >> ~/.ssh/known_hosts

另外,不要在您的ubuntu 用户上使用sudo,最好将其添加到docker 组或通过SSH 连接到docker 组中的用户。


如果您的 EC2 实例中还没有 docker 组,现在是配置它的好时机:

访问您的 EC2 实例并创建 docker 组:

$ sudo groupadd docker

ubuntu 用户添加到docker 组:

$ sudo usermod -aG docker ubuntu

现在将您的 script 更改为:

script:
    - echo $CI_REGISTRY_PASSWORD > docker_password
    - scp docker_password ubuntu@18.0.0.82:~/tmp/docker_password
    - ssh ubuntu@18.0.0.82 "cat ~/tmp/docker_password | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY; docker pull $CI_REGISTRY_IMAGE$tag; cd /home/crud_app; docker-compose up -d; docker logout; rm -f ~/tmp/docker_password"

另外,请记住,在 after_script 中,您不在 EC2 实例中,而是在运行器映像中,因此您不需要 logout,但最好杀死 SSH 代理。

最后的工作

deploy:
  stage: deploy
  before_script:
    - eval `ssh-agent`
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - ssh-keyscan -H 18.0.0.82 >> ~/.ssh/known_hosts
  script:
    - echo $CI_REGISTRY_PASSWORD > docker_password
    - scp docker_password ubuntu@18.0.0.82:~/tmp/docker_password
    - ssh ubuntu@18.0.0.82 "cat ~/tmp/docker_password | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY; docker pull $CI_REGISTRY_IMAGE$tag; cd /home/crud_app; docker-compose up -d; docker logout; rm -f ~/tmp/docker_password"
  after_script:
    - kill $SSH_AGENT_PID
    - rm docker_password
  rules:
    - if: $CI_COMMIT_BRANCH
      exists:
        - Dockerfile

【讨论】:

请解释一下这个脚本我没明白这里发生了什么“-scp docker_password ubuntu@18.0.0.82:~/tmp/docker_password” 您试图通过stdin 在登录中传递密码,但标准输入上没有任何内容。所以我把密码写在文件docker_password中,然后我用scp把它复制到EC2实例上。然后在登录时,我使用cat 读取该文件的内容,并将输出通过管道传送到docker login 命令。

Docker和AMI之间的区别

...布时间】:2017-05-3121:45:44【问题描述】:在AWS环境中:AMI用于打包软件,可以部署在EC2上。Docker也可以用来打包软件,也可以部署到EC2上。两者有什么区别,我该如何选择?【问题讨论】:从技术上讲,如果没有AMI,您无法在EC2... 查看详情

AWS - ECS - 如何在现有 ECS(带有 1 个 EC2)实例上重新部署更新的 Docker 映像?

】AWS-ECS-如何在现有ECS(带有1个EC2)实例上重新部署更新的Docker映像?【英文标题】:AWS-ECS-HowcanIredeployanupdatedDockerimageonanexistingECS(with1EC2)instance?【发布时间】:2019-05-2518:11:48【问题描述】:首先,我在AWS中创建了一个包含Docker... 查看详情

在 AWS EC2 上从 AWS ECR 中提取图像,而不使用 docker login,但使用 EC2 实例角色和 ECR 存储库权限

】在AWSEC2上从AWSECR中提取图像,而不使用dockerlogin,但使用EC2实例角色和ECR存储库权限【英文标题】:PullimagesfromAWSECRonAWSEC2withoutusingdockerloginbutusingEC2InstanceroleandECRrepositorypermissions【发布时间】:2018-03-2803:29:29【问题描述】:我... 查看详情

在 Gitlab CI 构建中,我无法通过私钥 ssh 进入 AWS EC2

】在GitlabCI构建中,我无法通过私钥ssh进入AWSEC2【英文标题】:InGitlabCIbuild,Ican\'tsshintoAWSEC2byprivatekey【发布时间】:2017-03-2613:06:52【问题描述】:一开始,我尝试在gitlabCI构建后使用ansible进行部署,但结果显示“主机无法访问”... 查看详情

通过 AWS ECS 在一个 EC2 实例中的多个 docker 容器

】通过AWSECS在一个EC2实例中的多个docker容器【英文标题】:MultipledockercontainersinoneEC2instancethroughAWSECS【发布时间】:2016-03-0204:05:59【问题描述】:是否可以通过AWSECS(EC2ContainerService)在一个EC2实例中运行多个docker容器?【问题讨... 查看详情

在 AWS ECS EC2 集群中运行 docker 镜像

】在AWSECSEC2集群中运行docker镜像【英文标题】:RundockerimageinsideAWSECSEC2Cluster【发布时间】:2021-08-1020:27:30【问题描述】:我创建了一个启动类型为EC2的AWSECS集群。基于ec2+windows的集群。我必须在这个集群中运行java应用程序的docker... 查看详情

使用 AWS CDK 创建用于构建 Docker 映像的 CodeBuild 项目

】使用AWSCDK创建用于构建Docker映像的CodeBuild项目【英文标题】:UseAWSCDKtocreateCodeBuildProjectforbuildingDockerImages【发布时间】:2021-02-0602:50:40【问题描述】:我想使用AWSCDK在源代码中定义CodeBuild项目。CodeBuild项目需要能够构建然后推... 查看详情

在springboot中设置aws凭证以进行本地测试和ec2部署

我对SpringBoot很陌生。我希望将我的项目托管在EC2上时,将我的应用程序设置为使用IAM角色进行S3访问,并在我的计算机上进行测试时使用本地凭据。我在AmazonS3ClientBuilder中使用DefaultAWSCredentialsProviderChain(),只是无法弄清楚在本地... 查看详情

具有 Auto Scaling 与弹性容器服务 (ECS) 的 AWS EC2 - Docker

...间】:2021-12-3005:53:16【问题描述】:我想在AWS云服务器中部署一个多服务(Celery、Redis和Django)的dockerized应用程序。我可以使用一个简单的EC2实例并将其附加到AutoSca 查看详情

AWS opsworks docker 服务发现

...间】:2017-03-0700:08:18【问题描述】:AWSopswork可以将docker部署到集群,ECS(ec2容器服务)也可以。EC2中的服务发现可以使用weave.net或consul等来实现...当我们使用opsworks进行docker部署时,关于如何添加动态服务发现的任何建议,所以... 查看详情

使用 Ansible playbook 在 AWS (Amazon) ec2 中部署 Play Framework 应用程序

】使用Ansibleplaybook在AWS(Amazon)ec2中部署PlayFramework应用程序【英文标题】:TodeployPlayFrameworkappsinAWS(Amazon)ec2usingAnsibleplaybook【发布时间】:2014-08-2612:34:41【问题描述】:我对AWSec2平台非常陌生。我想在ec2中部署我的play2.*应用程序。... 查看详情

如何在单个 AWS EC2 实例上的 Node 中部署多个微服务?

】如何在单个AWSEC2实例上的Node中部署多个微服务?【英文标题】:Howdoesonedeploymultiplemicro-servicesinNodeonasingleAWSEC2instance?【发布时间】:2018-10-2512:27:41【问题描述】:我们是AWS的新手,希望将多项服务部署到一个EC2实例中。每个微... 查看详情

在 ec2 实例中部署 eb 后,ruby 应用程序 aws 数据丢失

】在ec2实例中部署eb后,ruby应用程序aws数据丢失【英文标题】:rubyapplicationawsdatalossafterebdeployinec2instance【发布时间】:2016-09-0703:34:30【问题描述】:我按照本教程(http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Ruby_rails.html)... 查看详情

如何将 Airflow Scheduler 部署到 AWS EC2? [关闭]

...020-08-3014:06:16【问题描述】:我正在尝试使用Airflow在AWS上构建一个简单的数据管道。我创建了一个DAG,它每天将数据抓取到S3,然后使用在EMR上运行的Spark作业对其进行处理。我目前在本地笔记本电脑上运行Airflow 查看详情

具有无服务器框架 EC2 部署的 AWS

】具有无服务器框架EC2部署的AWS【英文标题】:AWSwithServerlessFrameworkEC2deployment【发布时间】:2018-12-3001:39:40【问题描述】:我们计划将我们的API部署到AWSLambda,对于本地开发,我们使用Serverless框架和ServerlessOffline。我们是否可以... 查看详情

AWS Elastic Beanstalk 与 EC2 容器服务 (ECS) - Docker

...17:40:57【问题描述】:一直在使用ElasticBeanstalk运行Docker来部署一个相对简单的应用程序,并且运行良好。现在随着ECS的出现,我很想知道这两种服务之间的区别是什么,以及为什么其中一 查看详情

在 AWS EC2 上部署 Web 应用程序

】在AWSEC2上部署Web应用程序【英文标题】:DeployWebApplicationonAWSEC2【发布时间】:2014-05-2116:05:04【问题描述】:我有一个需要将MySQL、JAVAJDK和JBoss部署到AWSEC2的Web应用程序。将其部署到最终客户的最佳实践和最佳方式是什么?我有... 查看详情

AWS Cloudformation 上的 UserData 未部署在 EC2 实例上

】AWSCloudformation上的UserData未部署在EC2实例上【英文标题】:UserDataonAWSCloudformationnotgettingdeployedonEC2instance【发布时间】:2021-12-2605:04:17【问题描述】:我正在尝试使用kubectl和nodejs等工具引导EC2。但是,我无法执行UserData。有人可... 查看详情