- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Docker 的新手,我之前的经验是将 Java Web 应用程序(在 Tomcat 容器中运行)部署到 Elastic Beanstalk。我习惯使用的管道是这样的:提交被检入 git,这会触发 Jenkins 作业,该作业构建应用程序 JAR(或 WAR)文件,将其发布到 Artifactory,然后将相同的 JAR 部署到应用程序在 Elastic Beanstalk 中使用 eb deploy
。 (抱歉,如果“管道”是一个保留术语;我是在概念上使用它。)
顺便说一句,我还将使用 Gitlab 进行 CI/CD 而不是 Jenkins(由于我无法控制的组织原因),但是从 Jenkins 到 Gitlab 的跳转对我来说似乎很简单——当然比从直接部署 WAR 以部署 Dockerized 容器。
进入 Docker 世界,我想管道会像这样:提交被检入 git,这会触发 Gitlab CI,然后构建 JAR 或 WAR 文件,将其发布到 Artifactory,然后使用 Dockerfile
到构建 Docker 镜像,将该 Docker 镜像发布到 Amazon ECR(也许?)...然后老实说,我不确定 Elastic Beanstalk 集成将如何从那里进行。我知道它与 Dockerrun.aws.json
文件有关,大概需要调用 AWS CLI。
我刚刚看完了来自 Amazon 的名为 Running Microservices and Docker on AWS Elastic Beanstalk 的网络研讨会,其中指出在我的 repo 的根目录中应该有一个 Dockerrun.aws.json
文件,它基本上定义了与 EB 的集成。但是,JSON 文件似乎包含指向 ECR 中单个 Docker 镜像的链接,这让我很不爽。每次构建新图像时,该链接不会更改吗?我想象 CI 需要动态更新 repo 中的 JSON 文件......这对我来说几乎感觉像是一种反模式。
在我上面链接的网络研讨会中,主持人创建了他的 Docker 镜像并使用 CLI 手动推送了 ECR。然后他手动将Dockerrun.aws.json
文件上传到EB。然而,他不需要上传应用程序,因为它已经包含在 Docker 镜像中。这一切对我来说似乎很奇怪,我怀疑我是否正确理解了事情。 Dockerrun.aws.json
文件是否需要在每次构建时更改?还是我想错了?
最佳答案
在我发布这个问题后的 8 个月里,我学到了很多东西,我们已经转向了不同的更好的技术。但我会发布我学到的东西来回答我原来的问题。
Dockerrun.aws.json 文件几乎与 ECS 任务定义完全相同。使用 Beanstalk 的 Multi-Docker 容器部署版本(相对于单个容器)很重要,即使您只部署单个容器。 IMO 他们应该摆脱 Beanstalk 的单容器平台,因为它非常无用。但假设您已将 Beanstalk 设置为多容器 Docker 平台,则 Dockerrun.aws.json 文件如下所示:
{
"AWSEBDockerrunVersion": 2,
"containerDefinitions": [
{
"name": "my-container-name-this-can-be-whatever-you-want",
"image": "my.artifactory.com/docker/my-image:latest",
"environment": [],
"essential": true,
"cpu": 10,
"memory": 2048,
"mountPoints": [],
"volumesFrom": [],
"portMappings": [
{
"hostPort": 80,
"containerPort": 80
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/aws/elasticbeanstalk/my-image/var/log/stdouterr.log",
"awslogs-region": "us-east-1",
"awslogs-datetime-format": "%Y-%m-%d %H:%M:%S.%L"
}
}
}
]
}
[
{
"name": "my-container-name-this-can-be-whatever-you-want",
"image": "my.artifactory.com/docker/my-image:latest",
"environment": [
{
"name": "VARIABLE1",
"value": "value1"
}
],
"essential": true,
"cpu": 10,
"memory": 2048,
"mountPoints": [],
"volumesFrom": [],
"portMappings": [
{
"hostPort": 0,
"containerPort": 80
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/aws/ecs/my-image/var/log/stdouterr.log",
"awslogs-region": "us-east-1",
"awslogs-datetime-format": "%Y-%m-%d %H:%M:%S.%L"
}
}
}
]
:latest
Docker 镜像,则无需更新该文件。您需要做的就是反弹 Beanstalk 实例(即重新启动环境),它会拉取任何
:latest
Docker 镜像可从 Artifactory(或 ECR,或您发布镜像的任何其他地方)获得。因此,构建管道需要做的就是发布
:latest
Docker 镜像到您的 Docker 存储库,然后使用 awscli 触发 Beanstalk 环境的重新启动,命令如下:
$ aws elasticbeanstalk restart-app-server --region=us-east-1 --environment-name=myapp
:latest
镜像到同一个存储库,如果环境碰巧自行重新启动,您将面临部署该不稳定分支的风险。因此,我建议您对 Docker 标签进行版本控制,并且只部署版本标签。所以不要指向
my-image:latest
,您会指向类似
my-image:1.2.3
的内容.这确实意味着您的构建过程必须在每次构建时更新 Dockerrun.aws.json 文件。然后你还需要做的不仅仅是一个简单的重启应用服务器。
$ eb deploy myapp --label 1.2.3 --timeout 1 || true
eb deploy
不幸的是,命令需要 FOREVER。 (这是我们切换到纯 ECS 的另一个原因;Beanstalk 慢得令人难以置信。)该命令在整个部署时间内都挂起,在我们的例子中可能需要 30 分钟或更长时间。这对于构建过程来说是完全不合理的,因此我强制该过程在 1 分钟后超时(它实际上会继续部署;它只是断开我的 CLI 客户端的连接并向我返回一个失败代码,即使它随后可能会成功)。
|| true
是一种有效地告诉 Gitlab 忽略失败退出代码并假装它成功的 hack。这显然是有问题的,因为无法判断 Elastic Beanstalk 部署是否真的失败了;我们假设它永远不会。
eb deploy
的另一件事:默认情况下,此工具将自动尝试压缩构建目录中的所有内容并将整个 ZIP 上传到 Beanstalk。你不需要那个;您只需要更新 Dockerrun.aws.json。为了做到这一点,我的构建步骤是这样的:
jq
更新 Dockerrun.aws.json
带有最新版本标签的文件 zip
创建一个名为 deploy.zip
的新 ZIP 文件并放 Dockerrun.aws.json
里面.elasticbeanstalk/config.yml
的文件到位(如下所述)eb deploy ...
命令 .elasticbeanstalk/config.yml
的构建目录中的文件。看起来像这样:
deploy:
artifact: deploy.zip
global:
application_name: myapp
default_region: us-east-1
workspace_type: Application
eb deploy
时,awsebcli 知道自动查找此文件。 .这个特定文件说的是寻找一个名为 deploy.zip 的文件,而不是尝试压缩整个目录本身。
:latest
部署方法是有问题的,因为你可能会部署一些不稳定的东西;版本化的部署方法是有问题的,因为部署脚本更复杂,并且因为除非您希望构建管道花费 30 分钟以上,否则部署有可能不会成功并且真的没有办法告诉(除了自己监控每个部署)。
关于amazon-web-services - 如何设置 Dockerized 应用程序到 Elastic Beanstalk 的持续集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49321670/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!