{"id":429,"date":"2024-07-20T00:12:00","date_gmt":"2024-07-20T00:12:00","guid":{"rendered":"http:\/\/blog.firatyasar.com\/?p=429"},"modified":"2025-03-30T00:17:06","modified_gmt":"2025-03-30T00:17:06","slug":"dockerfile-ve-docker-compose-ile-yarn-1-22-monoreposunda-turborepo-kullanimi","status":"publish","type":"post","link":"https:\/\/blog.firatyasar.com\/?p=429","title":{"rendered":"Dockerfile ile Yarn 1.22 Monorepos\u2019unda Turborepo Kullan\u0131m\u0131"},"content":{"rendered":"\n<p>E\u011fer daha \u00f6nce Yarn monorepo projelerinde \u00e7al\u0131\u015ft\u0131ysan\u0131z, birbirine ba\u011f\u0131ml\u0131 i\u015f alanlar\u0131na (workspace) sahip geli\u015ftirme i\u00e7in Docker konteyneri olu\u015fturman\u0131n zorluklar\u0131n\u0131 bilirsiniz. \u00d6zellikle, gereksiz yeniden derlemelerden ka\u00e7\u0131nmak zor olabilir. <strong>Turborepo<\/strong>, JavaScript ve TypeScript projeleri i\u00e7in optimize edilmi\u015f bir build sistemi olarak bu i\u015fi \u00e7ok daha kolay hale getiriyor.<\/p>\n\n\n\n<p>\u00d6rnek bir proje yap\u0131s\u0131 d\u00fc\u015f\u00fcnelim:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/project-directory\n    \/apps\n        \/frontend\n            - package.json\n        \/backend\n            - package.json\n    \/packages\n        \/shared-stuff\n            - package.json\n    .dockerignore\n    package.json\n    turbo.json\n    Dockerfile.dev\n    docker-compose.yml\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>Ad\u0131m 1: .dockerignore Dosyas\u0131n\u0131 Ayarlamak<\/strong><\/p>\n\n\n\n<p>Node mod\u00fclleri ve build \u00e7\u0131kt\u0131lar\u0131n\u0131 konteyn\u0131ra kopyalamaktan ka\u00e7\u0131nmak i\u00e7in <code>.dockerignore<\/code> dosyas\u0131n\u0131 \u015fu \u015fekilde ayarl\u0131yoruz:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>**\/node_modules\n**\/.next\n**\/dist\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>Ad\u0131m 2: package.json Yap\u0131s\u0131<\/strong><\/p>\n\n\n\n<p>Turborepo&#8217;yu kullanabilmek i\u00e7in a\u015fa\u011f\u0131daki minimal <code>package.json<\/code> yap\u0131s\u0131na ihtiyac\u0131n\u0131z var. Bu yap\u0131, <code>apps<\/code> ve <code>packages<\/code> dizinlerinde yer alan workspaces ile \u00e7al\u0131\u015f\u0131r.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"name\": \"turbo-docker-monorepo\",\n  \"version\": \"1.0.0\",\n  \"workspaces\": &#91;\"apps\/*\", \"packages\/*\"],\n  \"packageManager\": \"yarn@1.22.19\",\n  \"devDependencies\": {\n    \"turbo\": \"^1.9.6\"\n  }\n}\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>Ad\u0131m 3: turbo.json Yap\u0131land\u0131rmas\u0131<\/strong><\/p>\n\n\n\n<p>Turborepo&#8217;nun nas\u0131l \u00e7al\u0131\u015faca\u011f\u0131n\u0131 ve hangi komutlar\u0131 kullanaca\u011f\u0131n\u0131z\u0131 belirten <code>turbo.json<\/code> dosyas\u0131n\u0131 ayarl\u0131yoruz:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"$schema\": \"https:\/\/turbo.build\/schema.json\",\n  \"pipeline\": {\n    \"build\": {\n      \"dependsOn\": &#91;\"^build\"],\n      \"outputs\": &#91;\"dist\/**\", \".next\/**\"]\n    },\n    \"dev\": {\n      \"cache\": false,\n      \"persistent\": true\n    }\n  }\n}\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>Ad\u0131m 4: Dockerfile.dev Yap\u0131s\u0131<\/strong><\/p>\n\n\n\n<p>Bir\u00e7ok farkl\u0131 Docker katman\u0131n\u0131 kullanarak, projenin \u00e7al\u0131\u015fma ortam\u0131n\u0131 olu\u015fturuyoruz. \u0130lk ba\u015fta gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckl\u00fcyoruz, sonra uygulama dosyalar\u0131n\u0131 kopyalay\u0131p Turborepo&#8217;yu \u00e7al\u0131\u015ft\u0131r\u0131yoruz:<\/p>\n\n\n\n<p>Dockerfile<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM node:20.2-alpine3.17 as base\n\n# adding apk deps to avoid node-gyp related errors and some other stuff. adds turborepo globally\nRUN apk add -f --update --no-cache --virtual .gyp nano bash libc6-compat python3 make g++ \\\n      &amp;&amp; yarn global add turbo \\\n      &amp;&amp; apk del .gyp\n\n#############################################\nFROM base AS pruned\nWORKDIR \/app\nARG APP\n\nCOPY . .\n\n# see https:\/\/turbo.build\/repo\/docs\/reference\/command-line-reference#turbo-prune---scopetarget\nRUN turbo prune --scope=$APP --docker\n\n#############################################\nFROM base AS installer\nWORKDIR \/app\nARG APP\n\nCOPY --from=pruned \/app\/out\/json\/ .\nCOPY --from=pruned \/app\/out\/yarn.lock \/app\/yarn.lock\n\n# Forces the layer to recreate if the app's package.json changes\nCOPY apps\/${APP}\/package.json \/app\/apps\/${APP}\/package.json\n\n# see https:\/\/github.com\/moby\/buildkit\/blob\/master\/frontend\/dockerfile\/docs\/reference.md#run---mounttypecache\nRUN \\\n      --mount=type=cache,target=\/usr\/local\/share\/.cache\/yarn\/v6,sharing=locked \\\n      yarn --prefer-offline --frozen-lockfile\n\nCOPY --from=pruned \/app\/out\/full\/ .\nCOPY turbo.json turbo.json\n\n# For example: `--filter=frontend^...` means all of frontend's dependencies will be built, but not the frontend app itself (which we don't need to do for dev environment)\nRUN turbo run build --no-cache --filter=${APP}^...\n\n# re-running yarn ensures that dependencies between workspaces are linked correctly\nRUN \\\n      --mount=type=cache,target=\/usr\/local\/share\/.cache\/yarn\/v6,sharing=locked \\\n      yarn --prefer-offline --frozen-lockfile\n\n#############################################\nFROM base AS runner\nWORKDIR \/app\nARG APP\nARG START_COMMAND=dev\n\nCOPY --from=installer \/app .\n\nCMD yarn workspace ${APP} ${START_COMMAND}<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Sonu\u00e7:<\/strong><\/p>\n\n\n\n<p>Turborepo\u2019yu kullanarak Docker i\u00e7inde \u00e7ok verimli bir \u015fekilde geli\u015ftirme ortam\u0131 yaratabilirsiniz. Dockerfile ve docker-compose.yml dosyalar\u0131 ile konteynerinize h\u0131zl\u0131ca uygulama ekleyebilir ve do\u011fru bir \u015fekilde optimize edebilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>E\u011fer daha \u00f6nce Yarn monorepo projelerinde \u00e7al\u0131\u015ft\u0131ysan\u0131z, birbirine ba\u011f\u0131ml\u0131 i\u015f alanlar\u0131na (workspace) sahip geli\u015ftirme i\u00e7in Docker konteyneri olu\u015fturman\u0131n zorluklar\u0131n\u0131 bilirsiniz. \u00d6zellikle, gereksiz yeniden derlemelerden ka\u00e7\u0131nmak zor olabilir. Turborepo, JavaScript ve TypeScript projeleri i\u00e7in optimize edilmi\u015f bir build sistemi olarak bu i\u015fi \u00e7ok daha kolay hale getiriyor. \u00d6rnek bir proje yap\u0131s\u0131 d\u00fc\u015f\u00fcnelim: Ad\u0131m 1: .dockerignore Dosyas\u0131n\u0131\u2026 <span class=\"read-more\"><a href=\"https:\/\/blog.firatyasar.com\/?p=429\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":22,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[5,85,180,133,179,181],"_links":{"self":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts\/429"}],"collection":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=429"}],"version-history":[{"count":3,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts\/429\/revisions"}],"predecessor-version":[{"id":432,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts\/429\/revisions\/432"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/media\/22"}],"wp:attachment":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}