
Eğer daha önce Yarn monorepo projelerinde çalıştıysanız, birbirine bağımlı iş alanlarına (workspace) sahip geliştirme için Docker konteyneri oluşturmanın zorluklarını bilirsiniz. Özellikle, gereksiz yeniden derlemelerden kaçınmak zor olabilir. Turborepo, JavaScript ve TypeScript projeleri için optimize edilmiş bir build sistemi olarak bu işi çok daha kolay hale getiriyor.
Örnek bir proje yapısı düşünelim:
/project-directory
/apps
/frontend
- package.json
/backend
- package.json
/packages
/shared-stuff
- package.json
.dockerignore
package.json
turbo.json
Dockerfile.dev
docker-compose.yml
Adım 1: .dockerignore Dosyasını Ayarlamak
Node modülleri ve build çıktılarını konteynıra kopyalamaktan kaçınmak için .dockerignore
dosyasını şu şekilde ayarlıyoruz:
**/node_modules
**/.next
**/dist
Adım 2: package.json Yapısı
Turborepo’yu kullanabilmek için aşağıdaki minimal package.json
yapısına ihtiyacınız var. Bu yapı, apps
ve packages
dizinlerinde yer alan workspaces ile çalışır.
{
"name": "turbo-docker-monorepo",
"version": "1.0.0",
"workspaces": ["apps/*", "packages/*"],
"packageManager": "yarn@1.22.19",
"devDependencies": {
"turbo": "^1.9.6"
}
}
Adım 3: turbo.json Yapılandırması
Turborepo’nun nasıl çalışacağını ve hangi komutları kullanacağınızı belirten turbo.json
dosyasını ayarlıyoruz:
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**"]
},
"dev": {
"cache": false,
"persistent": true
}
}
}
Adım 4: Dockerfile.dev Yapısı
Birçok farklı Docker katmanını kullanarak, projenin çalışma ortamını oluşturuyoruz. İlk başta gerekli bağımlılıkları yüklüyoruz, sonra uygulama dosyalarını kopyalayıp Turborepo’yu çalıştırıyoruz:
Dockerfile
FROM node:20.2-alpine3.17 as base
# adding apk deps to avoid node-gyp related errors and some other stuff. adds turborepo globally
RUN apk add -f --update --no-cache --virtual .gyp nano bash libc6-compat python3 make g++ \
&& yarn global add turbo \
&& apk del .gyp
#############################################
FROM base AS pruned
WORKDIR /app
ARG APP
COPY . .
# see https://turbo.build/repo/docs/reference/command-line-reference#turbo-prune---scopetarget
RUN turbo prune --scope=$APP --docker
#############################################
FROM base AS installer
WORKDIR /app
ARG APP
COPY --from=pruned /app/out/json/ .
COPY --from=pruned /app/out/yarn.lock /app/yarn.lock
# Forces the layer to recreate if the app's package.json changes
COPY apps/${APP}/package.json /app/apps/${APP}/package.json
# see https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#run---mounttypecache
RUN \
--mount=type=cache,target=/usr/local/share/.cache/yarn/v6,sharing=locked \
yarn --prefer-offline --frozen-lockfile
COPY --from=pruned /app/out/full/ .
COPY turbo.json turbo.json
# 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)
RUN turbo run build --no-cache --filter=${APP}^...
# re-running yarn ensures that dependencies between workspaces are linked correctly
RUN \
--mount=type=cache,target=/usr/local/share/.cache/yarn/v6,sharing=locked \
yarn --prefer-offline --frozen-lockfile
#############################################
FROM base AS runner
WORKDIR /app
ARG APP
ARG START_COMMAND=dev
COPY --from=installer /app .
CMD yarn workspace ${APP} ${START_COMMAND}
Sonuç:
Turborepo’yu kullanarak Docker içinde çok verimli bir şekilde geliştirme ortamı yaratabilirsiniz. Dockerfile ve docker-compose.yml dosyaları ile konteynerinize hızlıca uygulama ekleyebilir ve doğru bir şekilde optimize edebilirsiniz.