{"id":20031842,"url":"https://github.com/wtnabe/example-node-and-ruby-docker-scripts-and-app","last_synced_at":"2026-04-09T12:33:09.128Z","repository":{"id":245256126,"uuid":"817709676","full_name":"wtnabe/example-node-and-ruby-docker-scripts-and-app","owner":"wtnabe","description":"multi language, multi phase, maintainable docker image example","archived":false,"fork":false,"pushed_at":"2024-06-23T01:02:30.000Z","size":25,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-12T18:10:02.801Z","etag":null,"topics":["dockerfile","nodejs","ruby","sinatra","vite"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wtnabe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-20T09:25:39.000Z","updated_at":"2024-06-23T17:13:04.000Z","dependencies_parsed_at":"2024-06-20T23:43:02.890Z","dependency_job_id":"81a0a81b-492c-4ece-9f7a-7e1f539b8c5a","html_url":"https://github.com/wtnabe/example-node-and-ruby-docker-scripts-and-app","commit_stats":null,"previous_names":["wtnabe/example-node-and-ruby-docker-scripts-and-app"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wtnabe%2Fexample-node-and-ruby-docker-scripts-and-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wtnabe%2Fexample-node-and-ruby-docker-scripts-and-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wtnabe%2Fexample-node-and-ruby-docker-scripts-and-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wtnabe%2Fexample-node-and-ruby-docker-scripts-and-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wtnabe","download_url":"https://codeload.github.com/wtnabe/example-node-and-ruby-docker-scripts-and-app/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241462706,"owners_count":19966910,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dockerfile","nodejs","ruby","sinatra","vite"],"created_at":"2024-11-13T09:34:55.715Z","updated_at":"2025-12-30T21:51:56.198Z","avatar_url":"https://github.com/wtnabe.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 効率的にメンテできるマルチ言語ランタイムのDockerイメージを目指して\n\n### 基本的な考え方\n\nCloud Native Buildpacks の考え方に倣いつつ、\n\n * builder image\n * runner image\n\nを明確に分離、runner から生成して実際にサーバ上で動作する\n\n * app image\n\nを加えて 3種類の image を管理する。その際、\n\n * base image を更新しやすくするために Dockerfile の外からパラメータを与える\n * そのパラメータを持ち、何回も実行するために sh script を用意\n\nしてある。sh script は以下の4種類。\n\n * builder image を docker build する\n * builder image を利用して app を compile する\n * runner image を build する\n * runner image に app コードをコピーして実行可能な image を作る\n\n※ 本当は docker push と deploy も必要だが、現時点ではそれは含んでいない\n\n### 概念図\n\n![](./docs/basic-concept.svg)\n\n### 気をつけたこと\n\n * app image が世界、インターネットとの接点であり、app image を頻繁に build すること、app image の base になる runner image を頻繁に build[^1] することが重要なので、runner image の build がローコストに実現できること\n * Dockerfile 内で base image に利用している OS の知識を必要以上に要求しない\n * Dockerfile に備わっている機能、docker build や docker run に備わっている機能に素直に従う\n * 開発環境のコードの配置をそのまま利用して Docker 環境、CI/CD 環境で各種 image を作りやすいこと\n\n### サンプル構成\n\n * Sinatra 4\n * Vite 5\n\nを組み合わせた Web アプリ（のフリをしたただの Hello, World）と HTTP リクエストを受け付けない console アプリ（の、フリry\n\nその下はあえてちょっと古めにしてある。\n\n * Ruby 3.1.2\n * Node.js 18.20\n * PostgreSQL 14[^2]\n\n[^1]: もちろんその base image を pull したうえで\n[^2]: 実際には使ってないが、builder と runner で必要な準備が違うことが分かるように入れてある\n\n### 参考\n\n * [What is a builder? · Cloud Native Buildpacks](https://buildpacks.io/docs/for-app-developers/concepts/builder/)\n * [マルチステージ ビルドを使う — Docker\\-docs\\-ja 24\\.0 ドキュメント](https://docs.docker.jp/develop/develop-images/multistage-build.html)\n * [Advanced ARG and ENV Dockerfile tricks \\| by Dubo Dubon Duponey \\| Medium](https://dubo-dubon-duponey.medium.com/advanced-arg-and-env-dockerfile-tricks-6b1eae68d02a)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwtnabe%2Fexample-node-and-ruby-docker-scripts-and-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwtnabe%2Fexample-node-and-ruby-docker-scripts-and-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwtnabe%2Fexample-node-and-ruby-docker-scripts-and-app/lists"}