我在Dockerfile
repo中有一个elastic-beanstalk
/ git
个应用程序,它从s3
中提取当前版本的应用程序的tarball并启动它。这在我第一次部署时效果很好; Docker容器构建完成,应用程序启动并正确运行。在我对应用进行更改后,问题就出现了,将tarball重新上传到s3
并运行eb deploy
。
$ eb deploy
INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
INFO: Successfully built aws_beanstalk/staging-app
INFO: Successfully pulled yadayada/blahblah:latest
INFO: Docker container 06608fa37b2c is running aws_beanstalk/current-app.
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.
但该应用尚未在*.elasticbeanstalk.com
上更新。我猜测,因为Dockerfile
没有改变,docker不会重建容器(并提取最新的应用程序tarball)。我希望能够强制重建,但eb
工具似乎没有这个选项。我可以从网站控制台强制重建,但显然这对自动化没有好处。我将每个更改提交到git
,我希望eb
能够使用它来知道重建是必要的,但这似乎没有任何区别。我是否以错误的方式使用docker / elastic-beanstalk?理想情况下,我想提交git
并让beanstalk自动重新安装应用程序。
答案 0 :(得分:6)
使用Docker for CI的问题在于它不像脚本一样,除非Dockerfile
发生变化,否则它不会重建。因此,您必须每次在启动包装器脚本而不是Dockerfile
中放置需要重建的内容。所以我将下载应用程序tarball的部分移动到Dockerfile
安装到容器的脚本中。然后当容器启动时,下载并解压缩tarball,然后才能启动真正的应用程序。这种方法有效,现在重新部署可以按预期工作。调试过程有点加剧,并让我认为使用Docker和EB for CI是一种黑客攻击。
答案 1 :(得分:0)
我想知道在Beanstalk中定义实例时是否可以尝试使用用户数据输入?这样的事情可能会在开机结束时发射:
#!/bin/bash
cd /app/dir/home
sudo docker pull username/container
... other things you may need to do ...
您可以参考更多有关用户数据脚本和可执行文件的信息: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html
答案 2 :(得分:0)
您应该 read this first 以更好地了解我们将在本地GIT信息库中使用本地网站以及 how to push it 最多ElasticBeanstalk以使网站生效。
在我们网站的根目录中查找或创建一个名为 .elasticbeanstalk 的文件夹。
在该文件夹中,我们将制作两个文件:
<强>配置强>
[global]
ApplicationName=YourApplicationNameFromAWSConsole
AwsCredentialFile=.elasticbeanstalk/aws_credentials
DevToolsEndpoint=git.elasticbeanstalk.us-east-1.amazonaws.com
EnvironmentName=EnvironmentNameFromAWSConsole
Region=us-east-1
<强> aws_credentials 强>
[global]
AWSAccessKeyId=AKIAxxxxxxxxxxxxxxxxxxxxx
AWSSecretKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
而不是eb deploy
使用git aws.push
向ElasticBeanstalk添加和提交所有内容
git add *.*
git commit -m "Adding AWS Configs"
git aws.push
答案 3 :(得分:0)
TLDR:您可能在没有HostDirectory的情况下使用ContainerDirectory,或者您可能需要使用--no-cache = true标志更新03build.sh以构建。
经过几十万小时之后,我终于用我的用例修复了这个问题。我正在使用CodePipeline运行CodeCommit,CodeBuild和Elastic Beanstalk,以便在AWS中使用docker创建持续集成/持续交付解决方案。我遇到的问题是CodeBuild成功构建并将新的docker映像发布到AWS ECR(EC2容器注册表),EBS正确地下拉了新映像,但Docker映像从未在服务器上更新。
在检查了EBS如何构建泊坞窗图像的整个过程之后(我发现了一篇非常棒的文章here, part 1和here part 2),我发现了这个问题。
要添加到文章中,在EBS上有一个三阶段流程,用于部署docker镜像的EC2实例。
此3阶段过程是一系列执行的bash文件,位于/opt/elasticbeanstalk/hooks/appdeploy/
。
前级包含以下shell脚本:
实施阶段是我的缓存问题实际发生的地方。制定阶段包括:
当我从Pre stage 03build.sh中生成的图像执行docker run时,我会看到我更新的更新。但是,当我执行00run.sh shell脚本时,会出现旧的更改。在调查docker run命令后,它正在执行
`Docker command: docker run -d -v null:/usr/share/nginx/html/ -v /var/log/eb-docker/containers/eb-current-app:/var/log/nginx ca491178d076`
-v null:/usr/share/nginx/html/
正在破坏它并导致它不更新。这是因为我的Dockerrun.aws.json文件有
"Volumes": [
{
"ContainerDirectory": "/usr/share/nginx/html/"
}
],
没有引用的主机位置。因此,我所做的任何未来更改都没有更新。
对于我的解决方案,我刚刚删除了"Volumes"
数组,因为我的所有文件都包含在我上传到ECR的docker镜像中。 注意:您可能还需要将--no-cache添加到03build.sh。