Closed trevonromanuik closed 8 years ago
Hi, I'm also having this problem. My prerender service is designed to redeploy each week and is now failing and I cannot spin up any new prerender due to this issue. Could we please have this issue resolved asap. Thank you
It looks like this is due to AWS running npm install
in /tmp/deployment/application
, letting everything install, then moving the application to /var/app/current
after everything has been installed.
Copying extracted folder /tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2-extract-1470158228290/phantomjs-2.1.1-linux-x86_64 -> /tmp/deployment/application/node_modules/prerender/node_modules/phridge/node_modules/phantomjs-prebuilt/lib/phantom
Writing location.js file
Done. Phantomjs binary available at /tmp/deployment/application/node_modules/prerender/node_modules/phridge/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs
and location.js contains the full path:
module.exports.location = "/tmp/deployment/application/node_modules/prerender/node_modules/phridge/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs"
On my local OSX machine, location.js only contains a partial path:
module.exports.location = "phantom/bin/phantomjs"
I'll look into the code, but is there a reason that it's a full path on linux and a relative path on OSX?
It looks like this commit changed the functionality of the tryPhantomjsInLib
function:
That should take you to the right line in that commit. You'll see that before, tryPhantomjsInLib
exited the process if a previous installation was found in the lib
folder, leaving the lib/location.js
file as-is. In the new version, tryPhantomjsInLib
will overwrite the lib/location.js
file with a new location set to the absolute path.
The is an edge case that's being run into because Elastic Beanstalk runs:
npm install --production
npm rebuild --production
It normally wouldn't happen, but that rebuild is causing install.js
to run a second time, causing tryPhantomjsInLib
to overwrite the location with an absolute path (currently in the /tmp directory). Once Elastic Beanstalk moves the application from /tmp/deployment
to /var/app/current
, that absolute path causes an error where it can't be found anymore.
@nicks is there a reason that change was made besides code cleanup?
maybe? not sure. feel free to send a PR
On Tue, Aug 2, 2016 at 8:09 PM, Todd Hooper notifications@github.com wrote:
It looks like this commit changed the functionality of the tryPhantomjsInLib function:
85f1d3c?diff=split#diff-f16acefe4b6553580c43edab685f50f3L351 https://github.com/Medium/phantomjs/commit/85f1d3c90a789261827bd19a42f1a8f228cb408a?diff=split#diff-f16acefe4b6553580c43edab685f50f3L351
That should take you to the right line in that commit. You'll see that before, tryPhantomjsInLib exited the process if a previous installation was found in the lib folder, leaving the lib/location.js file as-is. In the new version, tryPhantomjsInLib will overwrite the lib/location.js file with a new location set to the absolute path.
The is an edge case that's being run into because Elastic Beanstalk runs:
npm install --production npm rebuild --production
It normally wouldn't happen, but that rebuild is causing install.js to run a second time, causing tryPhantomjsInLib to overwrite the location with an absolute path (currently in the /tmp directory). Once Elastic Beanstalk moves the application from /tmp/deployment to /var/app/current, that absolute path causes an error where it can't be found anymore.
@nicks https://github.com/nicks is there a reason that change was made besides code cleanup?
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/Medium/phantomjs/issues/583#issuecomment-237089747, or mute the thread https://github.com/notifications/unsubscribe-auth/AARAcUH0Mk8qLNGxNdJQlmeEwIX9q5Peks5qb9w5gaJpZM4JYYgQ .
For people who need a quick fix for this and can't update yet:
create a file named `.ebextensions/phantomjs.config with the following contents:
commands:
01-installphantom:
env:
PATH: /sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/opt/elasticbeanstalk/node-install/node-v6.2.2-linux-x64/bin/
command: npm install -g phantomjs-prebuilt
(replace node version with the version you're using)
When I install phantomjs-prebuilt v2.1.7 the contents of location.js are as follows:
module.exports.location = "phantom/bin/phantomjs"
module.exports.platform = "linux"
module.exports.arch = "x64"
When I install phantomjs-prebuilt v2.1.8 the contents of location.js change to:
module.exports.location = "/tmp/deployment/application/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs"
module.exports.platform = "linux"
module.exports.arch = "x64"
Now AFAIK the way Amazon Elastic Beanstalk deploys work is that once a deploy is complete it copies the contents of /tmp/deployment/application to it's proper final location and wipes the /tmp directory, so the location that location.js is pointing to no longer exists. Why would the location in location.js have changed between v2.1.7 and v2.1.8?