{"id":228,"date":"2017-02-20T20:39:16","date_gmt":"2017-02-20T20:39:16","guid":{"rendered":"http:\/\/techblog.foreks.com\/?p=228"},"modified":"2024-07-02T13:02:11","modified_gmt":"2024-07-02T13:02:11","slug":"ruby-on-rails-development-life-cycle-on-docker-containers","status":"publish","type":"post","link":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/","title":{"rendered":"Ruby on Rails Development Life-cycle on Docker Containers"},"content":{"rendered":"<p>Before the containers have been integrated with the applications, the RoR application&#8217;s deployments are managed either manually or maintaining more handy tool such as <a href=\"http:\/\/capistranorb.com\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Capistrano<\/a>. Either way, there are a couple of required procedures needs to be applied on every new change set of the source code wanted to be deployed as a version.<\/p>\n<p>Administration point of view, RoR applications are threated as file based applications, similar to PHP.\u00a0 Unlike Java or Go, there is not one binary\/archived deployable artifact.\u00a0Therefore, every single change set contains several files and directories which leads the deployment ( directly or indirectly ) a process between SCM and the destination servers. Capistrano handles this quite well, especially In case of any deployment error, there is <a href=\"http:\/\/capistranorb.com\/documentation\/getting-started\/rollbacks\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">this automated rollback capability<\/a> which tries to keep all the target nodes in the cluster on the same version.<br \/>\n<!--more--><\/p>\n<p>A typical deployment procedure includes procedures as follows :<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Source code delivery from the\u00a0private SCM to the target servers (pulling operation)<\/li>\n<li>Dependency management for the libraries defined in the Gemfile.<\/li>\n<li>Applying necessary RAKE instruction for database operations ( <strong>rake db:seed<\/strong> or similiar )<\/li>\n<li>Finally, reloading the web server in order to serve the new version.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Therefore the dependency management is handled\u00a0on the target server, right after the deployment. The RoR applications are modular in development perspective; building the logic of application&#8217;s required dependencies (\u00a0<a href=\"https:\/\/rubygems.org\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gems<\/a>\u00a0) by defining them in a file called <a href=\"http:\/\/bundler.io\/gemfile.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Gemfile<\/a>. Developers keep the Gemfile in the root of the repository in SCM. After the dependencies are defined, one needs to run <strong>bundle install <\/strong>command by targeting the Gemfile to download all\u00a0the dependencies from central dependency servers.<\/p>\n<h3>Huge GEM_HOMEs Complicates Portability<\/h3>\n<p>Modularity comes at a cost. Dependencies in size could be huge in size which causes the obstacle when it comes to the portability of a container. A regular project could contain more than 400 MB dependencies in size ! Therefore the\u00a0Docker integration should be soft enough for developers to manage and feasible for operations to handle big dependency files.<\/p>\n<p>The solution provided in this article is to use a\u00a0Dockerfile which has an environmental configuration which sets the GEM_HOME variable at a custom location. This is the location where the defined gems are stored in the\u00a0environment. If there is a gem defined in the Gemfile which already exists in this path means no need to go &amp; fetch again via network. Without this dependency caching mechanism, It takes <em>minutes<\/em> to fetch the dependencies comparing to deploying and running the\u00a0application in seconds. This leads to the conclusion that the dependency caching\u00a0is a necessary improvement.<\/p>\n<p>One way is to store all the dependencies in the image itself and run the N<em>ginx<\/em> to get server up. However (as I have mentioned earlier), in this way, the Docker image becomes too big for shipment. The other option is to use a <a href=\"https:\/\/docs.docker.com\/engine\/userguide\/containers\/dockervolumes\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">docker volume\u00a0<\/a>which gives high level abstraction of data management inside containers.<\/p>\n<p><em>docker create -v \/ruby_gems\/2.2.1 &#8211;name dummyrorapp_gems busybox<\/em><\/p>\n<p>Creating the volume as above, can be achieved via a lightweight image like busybox since this will be a passive instance. Then, this instance needs to be provided to the applications container as follows :<\/p>\n<p><em>docker run -d &#8211;name=${APP_NAME} &#8211;volumes-from ${APP_NAME}_gems &#8211;link db:db &#8211;memory 1G &#8211;memory-swap 2G &#8211;memory-swappiness=0 &#8211;restart=unless-stopped ${REGISTRY}\/${APPNAME}:latest<\/em><\/p>\n<p>Actually, this is setup can be found a few places on the web provided as a solution, like this on <a href=\"https:\/\/www.healthcareblocks.com\/blog\/persistent-ruby-gems-docker-container\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">healthcareblocks<\/a>. However, making the volume optional with no additional\u00a0configuration is the tricky. Withing this solution, the instance will run no matter what; If the volume provided (even if the volume is empty) the gems will be downloaded and stored within the volume, otherwise the gems are stored in the application container.<\/p>\n<p>The <em>rake instructions<\/em> before the <em>nginx<\/em> command is for database operations like\u00a0<em>seed<\/em> and <em>migration<\/em>. The worker process manager for ruby code in the backend is chosen as <a href=\"https:\/\/www.phusionpassenger.com\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">passenger<\/a>. The fully functional Dockerfile stated as follows :<\/p>\n<pre class=\"prettyprint\">FROM debian:wheezy\nADD https:\/\/s3.eu-west-1.amazonaws.com\/sources.list \/etc\/apt\/sources.list\n\nRUN apt-get update \\\n    &amp;&amp; apt-get upgrade -y \\\n    &amp;&amp; apt-get install gnupg build-essential curl procps apt-transport-https ca-certificates libcurl4-openssl-dev libmysqlclient-dev xvfb imagemagick git -y\n\nRUN echo \"deb https:\/\/oss-binaries.phusionpassenger.com\/apt\/passenger wheezy main\" &gt;&gt; \/etc\/apt\/sources.list \\\n  &amp;&amp; curl -sSL https:\/\/rvm.io\/mpapis.asc | gpg --import -                                                   \\\n  &amp;&amp; apt-key adv --keyserver hkp:\/\/keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7                     \\\n  &amp;&amp; curl -sSL https:\/\/get.rvm.io | bash -s stable                                                      \n\nENV PATH $PATH:\/usr\/local\/rvm\/bin\nRUN rvm install ruby-2.2.1\nENV RUBY_VERSION ruby-2.2.1\n\nENV PATH \/usr\/local\/rvm\/gems\/ruby-2.2.1\/bin:\/usr\/local\/rvm\/gems\/ruby-2.2.1@global\/bin:\/usr\/local\/rvm\/rubies\/ruby-2.2.1\/bin:$PATH\n\n# Setup Passenger + Node + Nginx Couple\nRUN curl --fail -ssL -o setup-nodejs https:\/\/deb.nodesource.com\/setup_0.12 &amp;&amp; bash setup-nodejs            \\      \n  &amp;&amp; apt-get update                                                                                        \\\n  &amp;&amp; apt-get install -y nginx-extras passenger nodejs                                                       \n\nENV GEM_HOME \/ruby_gems\/2.2.1\nENV GEM_PATH $GEM_HOME:\/usr\/local\/rvm\/gems\/ruby-2.2.1@global\nENV MY_RUBY_HOME \/ruby_gems\/2.2.1\nENV BUNDLE_APP_CONFIG $GEM_HOME\nENV BUNDLER_VERSION 1.11.2\n\nARG RAKE\nARG RAILS_ENV_VAR\n\nENV RAKE_COMMAND $RAKE\nENV RAILS_ENVIRON $RAILS_ENV_VAR\n\nENV APP_HOME \/opt\/app\/ruby\/\nWORKDIR $APP_HOME\nADD . $APP_HOME\nRUN mkdir -p $APP_HOME\/tmp &amp;&amp; chmod 777 -R $APP_HOME\/tmp $APP_HOME\/config\/*yml\nCMD mkdir -p $GEM_HOME                  \\\n  &amp;&amp; gem install bundler                \\\n  &amp;&amp; bundle install --jobs 4 --retry 3  \\\n  &amp;&amp; RAILS_ENV=$RAILS_ENVIRON rake $RAKE_COMMAND   \\ \n &amp;&amp; nginx<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Before the containers have been integrated with the applications, the RoR application&#8217;s deployments are managed either manually or maintaining more handy tool such as Capistrano. Either way, there are a couple of required procedures needs to be applied on every new change set of the source code wanted to be deployed as a version. Administration [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":384,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-228","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Ruby On Rails Development Life-Cycle On Containers<\/title>\n<meta name=\"description\" content=\"Before the containers are integrated with the applications, RoR application&#039;s deployments are managed either manually or with handy tools.\" \/>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruby On Rails Development Life-Cycle On Containers\" \/>\n<meta property=\"og:description\" content=\"Before the containers are integrated with the applications, RoR application&#039;s deployments are managed either manually or with handy tools.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/\" \/>\n<meta property=\"og:site_name\" content=\"FinTech Trends, Emerging Technologies, News | ForInvest\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/forinvestcompany\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-20T20:39:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-07-02T13:02:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.forinvest.com\/insights\/wp-content\/uploads\/2017\/02\/ship.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2500\" \/>\n\t<meta property=\"og:image:height\" content=\"1500\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"ForInvest\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ForInvestCom\" \/>\n<meta name=\"twitter:site\" content=\"@ForInvestCom\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"ForInvest\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/\"},\"author\":{\"name\":\"ForInvest\",\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/#\\\/schema\\\/person\\\/af9ed1a8b25d7c4c02d55f24768bd6dd\"},\"headline\":\"Ruby on Rails Development Life-cycle on Docker Containers\",\"datePublished\":\"2017-02-20T20:39:16+00:00\",\"dateModified\":\"2024-07-02T13:02:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/\"},\"wordCount\":669,\"publisher\":{\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/ship.jpg\",\"articleSection\":[\"Devops\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/\",\"url\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/\",\"name\":\"Ruby On Rails Development Life-Cycle On Containers\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/ship.jpg\",\"datePublished\":\"2017-02-20T20:39:16+00:00\",\"dateModified\":\"2024-07-02T13:02:11+00:00\",\"description\":\"Before the containers are integrated with the applications, RoR application's deployments are managed either manually or with handy tools.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/ship.jpg\",\"contentUrl\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/ship.jpg\",\"width\":2500,\"height\":1500},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/2017\\\/02\\\/20\\\/ruby-on-rails-development-life-cycle-on-docker-containers\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby on Rails Development Life-cycle on Docker Containers\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/#website\",\"url\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/\",\"name\":\"ForInvest\",\"description\":\"Insights\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/#organization\"},\"alternateName\":\"ForInvest Yaz\u0131l\u0131m ve Teknoloji Hizmetleri A.\u015e.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/#organization\",\"name\":\"ForInvest Yaz\u0131l\u0131m ve Teknoloji Hizmetleri A.\u015e.\",\"alternateName\":\"ForInvest\",\"url\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/wp-content\\\/uploads\\\/2023\\\/11\\\/symbol.png\",\"contentUrl\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/wp-content\\\/uploads\\\/2023\\\/11\\\/symbol.png\",\"width\":152,\"height\":152,\"caption\":\"ForInvest Yaz\u0131l\u0131m ve Teknoloji Hizmetleri A.\u015e.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/forinvestcompany\",\"https:\\\/\\\/x.com\\\/ForInvestCom\",\"https:\\\/\\\/www.instagram.com\\\/forinvest.app\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/forinvestcompany\\\/mycompany\\\/verification\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@forinvestapp\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/#\\\/schema\\\/person\\\/af9ed1a8b25d7c4c02d55f24768bd6dd\",\"name\":\"ForInvest\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0434928dd4e664049c20d4d80338e5e2a9c59a36e8a561e47cc3a7234521fda4?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0434928dd4e664049c20d4d80338e5e2a9c59a36e8a561e47cc3a7234521fda4?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0434928dd4e664049c20d4d80338e5e2a9c59a36e8a561e47cc3a7234521fda4?s=96&r=g\",\"caption\":\"ForInvest\"},\"sameAs\":[\"http:\\\/\\\/foreksdigital.com\"],\"url\":\"https:\\\/\\\/www.forinvest.com\\\/insights\\\/author\\\/foreksdigital\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ruby On Rails Development Life-Cycle On Containers","description":"Before the containers are integrated with the applications, RoR application's deployments are managed either manually or with handy tools.","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"Ruby On Rails Development Life-Cycle On Containers","og_description":"Before the containers are integrated with the applications, RoR application's deployments are managed either manually or with handy tools.","og_url":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/","og_site_name":"FinTech Trends, Emerging Technologies, News | ForInvest","article_publisher":"https:\/\/www.facebook.com\/forinvestcompany","article_published_time":"2017-02-20T20:39:16+00:00","article_modified_time":"2024-07-02T13:02:11+00:00","og_image":[{"width":2500,"height":1500,"url":"https:\/\/www.forinvest.com\/insights\/wp-content\/uploads\/2017\/02\/ship.jpg","type":"image\/jpeg"}],"author":"ForInvest","twitter_card":"summary_large_image","twitter_creator":"@ForInvestCom","twitter_site":"@ForInvestCom","twitter_misc":{"Written by":"ForInvest","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/#article","isPartOf":{"@id":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/"},"author":{"name":"ForInvest","@id":"https:\/\/www.forinvest.com\/insights\/#\/schema\/person\/af9ed1a8b25d7c4c02d55f24768bd6dd"},"headline":"Ruby on Rails Development Life-cycle on Docker Containers","datePublished":"2017-02-20T20:39:16+00:00","dateModified":"2024-07-02T13:02:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/"},"wordCount":669,"publisher":{"@id":"https:\/\/www.forinvest.com\/insights\/#organization"},"image":{"@id":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/#primaryimage"},"thumbnailUrl":"https:\/\/www.forinvest.com\/insights\/wp-content\/uploads\/2017\/02\/ship.jpg","articleSection":["Devops"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/","url":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/","name":"Ruby On Rails Development Life-Cycle On Containers","isPartOf":{"@id":"https:\/\/www.forinvest.com\/insights\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/#primaryimage"},"image":{"@id":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/#primaryimage"},"thumbnailUrl":"https:\/\/www.forinvest.com\/insights\/wp-content\/uploads\/2017\/02\/ship.jpg","datePublished":"2017-02-20T20:39:16+00:00","dateModified":"2024-07-02T13:02:11+00:00","description":"Before the containers are integrated with the applications, RoR application's deployments are managed either manually or with handy tools.","breadcrumb":{"@id":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/#primaryimage","url":"https:\/\/www.forinvest.com\/insights\/wp-content\/uploads\/2017\/02\/ship.jpg","contentUrl":"https:\/\/www.forinvest.com\/insights\/wp-content\/uploads\/2017\/02\/ship.jpg","width":2500,"height":1500},{"@type":"BreadcrumbList","@id":"https:\/\/www.forinvest.com\/insights\/2017\/02\/20\/ruby-on-rails-development-life-cycle-on-docker-containers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.forinvest.com\/insights\/"},{"@type":"ListItem","position":2,"name":"Ruby on Rails Development Life-cycle on Docker Containers"}]},{"@type":"WebSite","@id":"https:\/\/www.forinvest.com\/insights\/#website","url":"https:\/\/www.forinvest.com\/insights\/","name":"ForInvest","description":"Insights","publisher":{"@id":"https:\/\/www.forinvest.com\/insights\/#organization"},"alternateName":"ForInvest Yaz\u0131l\u0131m ve Teknoloji Hizmetleri A.\u015e.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.forinvest.com\/insights\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.forinvest.com\/insights\/#organization","name":"ForInvest Yaz\u0131l\u0131m ve Teknoloji Hizmetleri A.\u015e.","alternateName":"ForInvest","url":"https:\/\/www.forinvest.com\/insights\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.forinvest.com\/insights\/#\/schema\/logo\/image\/","url":"https:\/\/www.forinvest.com\/insights\/wp-content\/uploads\/2023\/11\/symbol.png","contentUrl":"https:\/\/www.forinvest.com\/insights\/wp-content\/uploads\/2023\/11\/symbol.png","width":152,"height":152,"caption":"ForInvest Yaz\u0131l\u0131m ve Teknoloji Hizmetleri A.\u015e."},"image":{"@id":"https:\/\/www.forinvest.com\/insights\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/forinvestcompany","https:\/\/x.com\/ForInvestCom","https:\/\/www.instagram.com\/forinvest.app\/","https:\/\/www.linkedin.com\/company\/forinvestcompany\/mycompany\/verification\/","https:\/\/www.youtube.com\/@forinvestapp"]},{"@type":"Person","@id":"https:\/\/www.forinvest.com\/insights\/#\/schema\/person\/af9ed1a8b25d7c4c02d55f24768bd6dd","name":"ForInvest","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/0434928dd4e664049c20d4d80338e5e2a9c59a36e8a561e47cc3a7234521fda4?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/0434928dd4e664049c20d4d80338e5e2a9c59a36e8a561e47cc3a7234521fda4?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0434928dd4e664049c20d4d80338e5e2a9c59a36e8a561e47cc3a7234521fda4?s=96&r=g","caption":"ForInvest"},"sameAs":["http:\/\/foreksdigital.com"],"url":"https:\/\/www.forinvest.com\/insights\/author\/foreksdigital\/"}]}},"_links":{"self":[{"href":"https:\/\/www.forinvest.com\/insights\/wp-json\/wp\/v2\/posts\/228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.forinvest.com\/insights\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.forinvest.com\/insights\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.forinvest.com\/insights\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.forinvest.com\/insights\/wp-json\/wp\/v2\/comments?post=228"}],"version-history":[{"count":1,"href":"https:\/\/www.forinvest.com\/insights\/wp-json\/wp\/v2\/posts\/228\/revisions"}],"predecessor-version":[{"id":385,"href":"https:\/\/www.forinvest.com\/insights\/wp-json\/wp\/v2\/posts\/228\/revisions\/385"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.forinvest.com\/insights\/wp-json\/wp\/v2\/media\/384"}],"wp:attachment":[{"href":"https:\/\/www.forinvest.com\/insights\/wp-json\/wp\/v2\/media?parent=228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.forinvest.com\/insights\/wp-json\/wp\/v2\/categories?post=228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.forinvest.com\/insights\/wp-json\/wp\/v2\/tags?post=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}