I am trying to deploy a Docker image of a Spring Boot application to AWS Elastic Beanstalk and I'm encountering this error in /var/log/eb-activity.log:
Docker container quit unexpectedly after launch: Docker container quit unexpectedly on Wed Jun 22 11:56:25 UTC 2016:
Error: Unable to access jarfile /home/packedit/app/packed-it.jar. Check snapshot logs for details. (Executor::NonZeroExitStatus)
This is a single container on Elastic Beanstalk with the following Dockerrun.aws.json:
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "packedit/packedit-api",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "8080"
}
],
"Volumes": [
{
"HostDirectory": "/var/app/packedit",
"ContainerDirectory": "/home/packedit/app"
}
],
"Logging": "/home/packedit/app/logs"
}
This is the Dockerfile:
FROM java:8
MAINTAINER my#email.com
VOLUME /tmp
EXPOSE 8080
ENV USER_NAME packedit
ENV APP_HOME /home/$USER_NAME/app
ENV APP_FILENAME packed-it.jar
RUN useradd -ms /bin/bash $USER_NAME
RUN mkdir -p $APP_HOME/data
ADD $APP_FILENAME $APP_HOME/$APP_FILENAME
RUN chown -R $USER_NAME $APP_HOME/
USER $USER_NAME
WORKDIR $APP_HOME
RUN bash -c 'touch $APP_FILENAME'
# Can't use $APP_FILENAME here because ENTRYPOINT does not do ENV replacement
# See: http://stackoverflow.com/a/28854410/336752
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","packed-it.jar"]
I have successfully deployed the Docker image to an EC2 instance using ECS but I have not succeeded with Elastic Beanstalk. My guess is that I am doing something wrong with the volumes but I am struggling to understand the documentation. I originally started with a multicontainer configuration but have simplified to try and isolate my issue.
Thanks for any advice.
You need to remove the line
"ContainerDirectory": "/home/packedit/app"
from your Dockerrun.aws.json.
It seems like the confusion is with how docker volumes work. The volumes are allocated at runtime and persist on consecutive runs on the same machine.
Here is what is happening. The docker image is built with jar in /home/packedit/app but since you have defined a volume in the same location, an empty volume is created when it is run and mounted in that location. Hence, the same directory of the image is ignored.
Here is how you can reproduce the issue locally:
docker build .
docker run -v /home/packedit/app IMAGEID_FROM_OUTPUT_OF_PREVIOUS_COMMAND
Related
I have a Docker container specified through Dockerfile which has to be run with the -p flag in order to function properly. On my local machine, after running
docker run -d -p 5000:5000 blagtagger:v0.4.3
the port mapping is shown as 0.0.0.0:5000->5000/tcp and everything works smoothly.
Now, I need to deploy it on AWS Elastic Beanstalk, so I prepared my Dockerrun.aws.json file as follows:
{
"AWSEBDockerrunVersion": "1",
"Ports": [
{
"ContainerPort": 5000,
"HostPort": 5000
}
]
}
However, the container port does not seem to map to the host port correctly. The port mapping is shown as 5000/tcp.
How can I ask Beanstalk to set the mapping to 0.0.0.0:5000->5000/tcp?
It turns out there is no elegant way to accomplish this. Along the lines of the answers here and here, I added the following in a file named .ebextensions/01-commands.config:
commands:
00001_add_port_mapping:
cwd: /tmp
command: 'sed -i "s/docker run -d/docker run -p 5000:5000 -d/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh'
and discarded the Dockerrun.aws.json file.
I've got a very straightforward Flask application running in a single docker container. When I run the app using eb local run it "works" in that the docker image is built, and I eventually see the log output from flask letting me know it's ready for requests. But when I actually attempt to query the running application, the requests fail immediately with errors saying 'the site cant be reached'. It seems like the app is running in the container, but somehow the ports aren't exposed correctly? Also, when I run it using docker run ... it works completely and I'm able to query the application.
Command I'm using:
eb local run --port 5000 --envvars APP_ENV=LOCAL
My Dockerrun.aws.json:
{
"AWSEBDockerrunVersion": "1",
"Ports": [
{
"ContainerPort": 5000,
"HostPort": 5000
}
]
}
My Dockerfile:
FROM python:3
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT [ "python" ]
CMD [ "application.py" ]
My .elasticbeanstalk/config.yml:
branch-defaults:
python3:
environment: fs-service-prod
environment-defaults:
fs-service-prod:
branch: null
repository: null
global:
application_name: followspot-service
default_ec2_keyname: null
default_platform: arn:aws:elasticbeanstalk:us-east-1::platform/Docker running on
64bit Amazon Linux/2.12.11
default_region: us-east-1
include_git_submodules: true
instance_profile: null
platform_name: null
platform_version: null
profile: null
sc: git
workspace_type: Application
Output of eb local status:
Platform: 64bit Amazon Linux 2018.03 v2.12.11 running Docker 18.06.1-ce
Container name: 6739a687fa2d18f1c683926f024c88bed9f5c6c7
Container ip: 127.0.0.1
Container running: True
Exposed host port(s): 5000
Full local URL(s): 127.0.0.1:5000
Thanks so much for any help you can give me and let me know if there's a good way to go about getting more helpful info.
Figured it out! Turns out this was an issue with how I was starting my Flask app. Because flask by default runs on 127.0.0.1 and Docker by default runs tries to connect to 0.0.0.0, I needed to change how the app is started in my Dockerfile.
Instead of:
ENTRYPOINT [ "python" ]
CMD [ "application.py" ]
I had to change it to:
ENV FLASK_APP application.py
ENTRYPOINT ["python", "-m", "flask", "run", "--host=0.0.0.0"]
Then everything worked as expected.
I'm trying to deploy my application with docker and elastic beanstalk. My Dockerrun.aws.json file looks like
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "jvans/maven_weekly",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "5000"
}],
"Volumes": [
{
"HostDirectory": "/Users/jamesvanneman/Code/maven_weekly/maven_weekly",
"ContainerDirectory": "/maven_weekly"
}
],
"Logging": "/var/log/nginx"
}
I created this application with eb create and when I run eb deploy I get
Docker container quit unexpectedly after launch: Docker container quit
unexpectedly on Mon Sep 21 01:15:12 UTC 2015:. Check snapshot logs for details.
Hook /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
In var/log/eb-activity.log I see the following errors:
Docker container quit unexpectedly after launch: Docker container quit unexpectedly on Mon Sep 21 01:08:52 UTC 2015:. Check snapshot logs for details. (ElasticBeanstalk::ExternalInvocationError)
caused by: 83ea9b7f9a069eeb8351fef7aaedb8374f7dfe300a5e0aaeba0fe17600583175
[2015-09-21T01:08:52.205Z] INFO [2246] - [Application deployment/StartupStage1/AppDeployEnactHook/00run.sh] : Activity failed.
So it seems like there's a problem with a startup script. If i ssh into the container and try to run it manually I don't really get any extra help from error messages.
eb ssh
sudo /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
Docker container quit unexpectedly after launch: Docker container quit unexpectedly on Mon Sep 21 01:34:52 UTC 2015:. Check snapshot logs for details.
Msg: Docker container quit unexpectedly after launch: Docker container quit unexpectedly on Mon Sep 21 01:34:52 UTC 2015:. Check snapshot logs for details.
Are snapshot logs something different than what's in var/log/eb-activity.log? Any Idea what is going on/how I can debug this further?
Docker dumps are stored in the host box at /var/log/eb-docker/containers/.
Go there and you'll find the docker startup crash log that should indicate the root cause of your problem.
You want to look at
/var/log/eb-docker/containers/eb-current-app/unexpected-quit.log
in the bundle downloaded by eb logs --all or using eb ssh. This log file will have the stdout and stderr of your application before it crashed.
In my case, unexpected-quit.log was empty and the other log files in /var/log/ didn't help.
So I found out why the container was crashing by manually running the image on the server.
[ec2-user#ip-xxx-xxx-xxx-xxx ~]$ nano Dockerfile # or clone the entire project
[ec2-user#ip-xxx-xxx-xxx-xxx ~]$ sudo docker build -t test .
[ec2-user#ip-xxx-xxx-xxx-xxx ~]$ sudo docker run --rm test
Exception in thread "main" …
I fixed that exception, redeployed a new version and now the container starts without issues.
In my case I did an eb ssh to connect into the ec2 instance and looked at my server logs. It was an application error. Nothing to do with AWS. Fixed it. Tried again and it's working!
Im running a Play Framework app on AWS Beanstalk with Docker (64bit Amazon Linux 2015.03 v1.4.1 running Docker 1.6.0).
Docker File:
FROM relateiq/oracle-java8
MAINTAINER XXXX
EXPOSE 9000
ADD files /
WORKDIR /opt/docker
RUN ["chown", "-R", "daemon", "."]
RUN ["chmod", "+x", "bin/app"]
USER daemon
ENTRYPOINT ["bin/app"]
CMD []
Dockerrun.aws.json
{
"AWSEBDockerrunVersion": "1",
"Ports": [{
"ContainerPort": "9000"
}]
}
When the instance first starts I get about 1 minute where its deployed as normal, then after I browse a few pages the error shows:
502 Bad Gateway
nginx/1.6.2
The error in the ElasticBeanstalk logs is:
Play server process ID is 1 This application is already running (Or delete /opt/docker/RUNNING_PID file).
I also get in the /var/log/docker-events.logthe following messages every 30 seconds:
2015-05-30T20:07:58.000000000Z d0425e47095e5e2637263a0fe9b49ed759f130f31c041368ea48ce3d99d1e947: (from aws_beanstalk/current-app:latest) start
2015-05-30T20:08:15.000000000Z d0425e47095e5e2637263a0fe9b49ed759f130f31c041368ea48ce3d99d1e947: (from aws_beanstalk/current-app:latest) die
2015-05-30T20:08:16.000000000Z d0425e47095e5e2637263a0fe9b49ed759f130f31c041368ea48ce3d99d1e947: (from aws_beanstalk/current-app:latest) start
2015-05-30T20:08:31.000000000Z d0425e47095e5e2637263a0fe9b49ed759f130f31c041368ea48ce3d99d1e947: (from aws_beanstalk/current-app:latest) die
Can anyone see my issue? Cheers.
Adding the following to build.sbt should resolve the issue:
javaOptions in Universal ++= Seq("-Dpidfile.path=/dev/null")
I have created an application in Elastic Beanstalk to host a play framework 2 app there using instructions from this project.
I have packaged the project exactly like Docker needs but when I upload the final zip to the application I receive a permission denied error in this flow:
Environment update is starting.
Deploying new version to instance(s).
Successfully pulled dockerfile/java:latest
Successfully built aws_beanstalk/staging-app
Docker container quit unexpectedly after launch: Docker container quit unexpectedly on Fri Sep 12 23:32:44 UTC 2014: 2014/09/12 23:32:39 exec: "bin/my-sample-project": permission denied. Check snapshot logs for details.
I have spent hours on this without any success.
This is the content of my root Dockerfile:
FROM dockerfile/java
MAINTAINER Cristi Boariu <myemail>
EXPOSE 9000
ADD files /
WORKDIR /opt/docker
RUN ["chown", "-R", "daemon", "."]
USER daemon
ENTRYPOINT ["bin/mytweetalerts"]
CMD []
Any hint how to solve this issue?
Here's what I did to solve this same issue, though I'm not sure which part specifically solved it.
My DockerFile looks like:
FROM dockerfile/java
MAINTAINER yourNameHere
EXPOSE 9000 9443
ADD files /
WORKDIR /opt/docker
RUN ["chown", "-R", "daemon", "."]
# Make sure myApp is excutable
RUN ["chmod", "+x", "bin/myApp"]
USER daemon
# If running a t1.micro or other memory limited instance
# be sure to limit play memory. This assumes play 2.3.x
ENTRYPOINT ["bin/myApp", "-mem", "512", "-J-server"]
CMD []
See https://www.playframework.com/documentation/2.3.x/ProductionConfiguration for info on setting jvm memory.
My Dockerrun.aws.json (also required) looks like:
{
"AWSEBDockerrunVersion": "1",
"Ports": [
{
"ContainerPort": "9000"
}
]
}
Finally my play application lives in files/opt/docker with the run script in docker/bin. All this is zipped up and sent to EB.
Add a chmod command to make your file executable:
RUN ["chmod", "+x", "bin/myApp"]
So your Dockerfile will be:
FROM dockerfile/java
MAINTAINER Cristi Boariu <myemail>
EXPOSE 9000
ADD files /
WORKDIR /opt/docker
RUN ["chown", "-R", "daemon", "."]
USER daemon
RUN ["chmod", "+x", "bin/myApp"]
ENTRYPOINT ["bin/mytweetalerts"]
CMD []