Dockerfile ile Yarn 1.22 Monorepos’unda Turborepo Kullanımı

By | July 20, 2024

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.

Leave a Reply

Your email address will not be published. Required fields are marked *