-
-
Save enspdf/0f86a7bc321a57cf47e1ec4cc06d28a2 to your computer and use it in GitHub Desktop.
Revisions
-
zeagord revised this gist
Apr 7, 2017 . 1 changed file with 5 additions and 1 deletion.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -97,4 +97,8 @@ CMD ["pm2 start"] * **Final image size: ~400MB (~1.2 GB earlier)** * **Build time: 10 seconds (15 minutes earlier)** Note: All the image sizes mentioned are uncompressed version sizes. The actualy size uploaded to docker registries will be compressed and will smaller than the sizes mentioned. Next Steps: Need to explore options to reduce the size by exploring the official wheezy/alpine versions and install node by my self and test. -
zeagord revised this gist
Apr 7, 2017 . 1 changed file with 2 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -94,5 +94,7 @@ WORKDIR /usr/src/app CMD ["pm2 start"] ``` * **Final image size: ~400MB (~1.2 GB earlier)** * **Build time: 10 seconds (15 minutes earlier)** -
zeagord revised this gist
Apr 7, 2017 . 1 changed file with 2 additions and 2 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -94,5 +94,5 @@ WORKDIR /usr/src/app CMD ["pm2 start"] ``` * **Final image size: ~400MB (~1.2 GB earlier)** * **Build time: 10 seconds (15 minutes earlier)** -
zeagord revised this gist
Apr 7, 2017 . No changes.There are no files selected for viewing
-
zeagord revised this gist
Apr 7, 2017 . 1 changed file with 2 additions and 3 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -94,6 +94,5 @@ WORKDIR /usr/src/app CMD ["pm2 start"] ``` Final image size: ~400MB (~1.2 GB earlier) Build time: 10 seconds (15 minutes earlier) -
zeagord revised this gist
Apr 7, 2017 . 1 changed file with 68 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -5,6 +5,7 @@ different CI/CD pipelines and environments. The initial docker file was looking something like this: ## Initial Docker File ``` FROM node:6.10.1-alpine ENV APP_ENV $APP_ENV @@ -29,3 +30,70 @@ ADD start.sh /start.sh RUN chmod 755 /start.sh CMD ["/start.sh"] ``` ## PROBLEMS 1. Docker Image Size 2. Image build Time 3. Configure the image building process for different environment pipeline ## Solution I first decided to upgrade to Node:6 because of the LTS (Long Term Support), next I wanted to use a slim version of offcial node docker image. I didn't choose the alpine version for the reason there is no official support for node-sass. There are plethora of docker images available with sass-alpine-node version. But I strongly recommend not to use it for security reasons. ``` FROM node:6-slim ``` Secondly I want to build a base web image specific to my project with all the node_modules dependencies installed. Whenever we add a new module to npm package, we need to build the base image once which is not going to happen super frequently. The next thing, I did after updating to node 6 was to make use of in built node capabilities. You can read more about them in the official npmjs website more. Removes the duplicate refrences of node modules ``` npm dedupe ``` Removes the unreferenced node modules ``` npm prune ``` Create a shrinkwrap to lock down the node module versions ``` npm shrinkwrap ``` This has reduced the number of modules get installed and the size of the node_modules directory. The final base image docker file looked like below. ``` FROM node:6-slim ENV APP_ENV $APP_ENV ENV BINPATH /usr/bin COPY wkhtmltox/bin/wkhtmltopdf /usr/local/bin/ RUN mkdir -p /usr/src/app COPY package.json /usr/src/app/ WORKDIR /usr/src/app/ RUN npm install --production ``` Then I built a base image like below: ``` docker build -t base-web-image:<version-number> . ``` After this I removed the executing the grunt task out the docker image build process and moved it to the build agent machine. ``` grunt --env=prod ``` As a final step, whenever a business logic or new code is pushed a new image needs to be built as a final application. I refered the image built earlier and started to refer it in the second image. ``` FROM base-web-image RUN mkdir -p /usr/src/app COPY dist /usr/src/app WORKDIR /usr/src/app CMD ["pm2 start"] ``` -
zeagord revised this gist
Apr 7, 2017 . 1 changed file with 2 additions and 10 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -5,35 +5,27 @@ different CI/CD pipelines and environments. The initial docker file was looking something like this: ``` FROM node:6.10.1-alpine ENV APP_ENV $APP_ENV ENV BINPATH /usr/bin COPY wkhtmltox/bin/wkhtmltopdf /usr/local/bin/ RUN mkdir -p /usr/src/app WORKDIR /usr/src/app/ # Install app dependencies COPY package.json /usr/src/app/ #COPY start.sh /usr/src/app/ RUN npm install --production RUN npm install -g [email protected] # Bundle app source COPY . /usr/src/app # Install pm2 so we can run our app RUN npm i -g pm2 # run grunt, cd to dist, node server.js RUN grunt --env=prod #COPY start.sh dist WORKDIR dist ADD start.sh /start.sh RUN chmod 755 /start.sh CMD ["/start.sh"] ``` -
zeagord revised this gist
Apr 7, 2017 . 2 changed files with 39 additions and 7 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,7 +0,0 @@ This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,39 @@ When we were trying to create a docker image for our Node JS based application, we chose to use the official Node docker image (~700MB). On top of that we need to add the node modules, business logic, etc and so on. The final image size was staggering (~1.2GB). It was not what we wanted. Secondly, the average build time to do NPM install and run a grunt task totally took 15 minutes for every build. I am not even talking about the pain of configuring this for different CI/CD pipelines and environments. The initial docker file was looking something like this: ` FROM node:6.10.1-alpine ENV APP_ENV $APP_ENV ENV BINPATH /usr/bin COPY wkhtmltox/bin/wkhtmltopdf /usr/local/bin/ RUN mkdir -p /usr/src/app WORKDIR /usr/src/app/ # Install app dependencies COPY package.json /usr/src/app/ #COPY start.sh /usr/src/app/ RUN npm install --production RUN npm install -g [email protected] # Bundle app source COPY . /usr/src/app # Install pm2 so we can run our app RUN npm i -g pm2 # run grunt, cd to dist, node server.js RUN grunt --env=prod #COPY start.sh dist WORKDIR dist ADD start.sh /start.sh RUN chmod 755 /start.sh CMD ["/start.sh"] ` -
zeagord created this gist
Apr 7, 2017 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,7 @@ When we were trying to create a docker image for our Node JS based application, we chose to use the official Node docker image (~700MB). On top of that we need to add the node modules, business logic, etc and so on. The final image size was staggering (~1.2GB). It was not what we wanted. Secondly, the average build time to do NPM install and run a grunt task totally took 15 minutes for every build. I am not even talking about the pain of configuring this for different CI/CD pipelines and environments. The initial docker file was looking something like this: