关键词:
【中文标题】用于在 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。有人可... 查看详情