Docker with Strapi [CI-CD Azure DevOps]
Merhaba,
Bu makalede strapi uygulamasını dockerize olarak kullanacağız.
1-Yeni bir proje oluşturuyoruz.
npx create-strapi-app@latest strapidemo –quickstart
-Projemiz başarılı bir şekilde oluşturuldu. Sizde de aşağıda ki şekilde dosyaların oluşması gerekiyor. (Dockerfile ve docker-compose.yml hariç)
–Dockerfile hazırlanması. D harfi büyük olacak şekilde aşağıdaki kodları alıp sudo nano Dockerfile ile projemizin root dizinininde oluşturuyoruz.
FROM node:16
# Installing libvips-dev for sharp Compatability
RUN apt-get update && apt-get install libvips-dev -y
ARG NODE_ENV=development
ENV NODE_ENV=${NODE_ENV}
WORKDIR /opt/
COPY . .
ENV PATH /opt/node_modules/.bin:$PATH
RUN npm install
WORKDIR /opt/app
COPY ./ .
RUN npm run build
EXPOSE 1337
CMD ["npm", "run", "develop"]
– .dockerignore dosyası oluşturuyoruz
.tmp/
.cache/
.git/
build/
node_modules/
data/
-docker-compose.yml dosyayını aynı şekilde root dizininde oluşturuyoruz.
version: "3"
services:
strapi:
container_name: strapi
build: .
image: mystrapi:latest
restart: unless-stopped
env_file: .env
environment:
DATABASE_CLIENT: ${DATABASE_CLIENT}
DATABASE_HOST: strapiDB
DATABASE_NAME: ${DATABASE_NAME}
DATABASE_USERNAME: ${DATABASE_USERNAME}
DATABASE_PORT: ${DATABASE_PORT}
JWT_SECRET: ${JWT_SECRET}
ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
NODE_ENV: ${NODE_ENV}
volumes:
- ./config:/opt/app/config
- ./src:/opt/app/src
- ./package.json:/opt/package.json
- ./package.json:/opt/package.json
- ./.env:/opt/app/.env
ports:
- "1337:1337"
networks:
- strapi
depends_on:
- strapiDB
strapiDB:
image: postgres:12.0-alpine
container_name: strapiDB
platform: linux/amd64 #for platform error on Apple M1 chips
restart: unless-stopped
env_file: .env
environment:
POSTGRES_USER: ${DATABASE_USERNAME}
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
POSTGRES_DB: ${DATABASE_NAME}
volumes:
- strapi-data:/var/lib/postgresql/data/ #using a volume
#- ./data:/var/lib/postgresql/data/ # if you want to use a bind folder
ports:
- "5432:5432"
networks:
- strapi
volumes:
strapi-data:
networks:
strapi:
name: Strapi
driver: bridge
–Projenin root dizininde data isimli bir klasör oluşturup bunu .gitignore dosyasına ekliyoruz.mkdir data
–config/database.js
dosyasını aşağıdaki gibi güncelliyoruz. sqlite olan kısmı postgres olarak ve en alt kısımda bulunan bilgileride güncelliyoruz.
-Npm PG install; bu host machine’de postgre kullanacağımızı iletiyor.
npm install pg
-.env dosyasının oluşturulması, bu dosya yeni bir strapi projesi oluşturduğunuz da otomatik olarak oluşuyor. #Database etiketinden sonra ki kısmını dolduruyoruz ve kullanacağımız database’e ait bilgileri giriyoruz.
HOST=0.0.0.0
PORT=1337
APP_KEYS=V4wROGRzavnx8dnUQLHGvQ==,FU+CLcSl2cYzW+8uCZz/aA==,KTb9Hx+N//c6vfkTTpMU4Q==,YjJ7sJhQb2RZH5QBVTULMA==
API_TOKEN_SALT=rtFPwZ+cuImsrilRDPSuWw==
ADMIN_JWT_SECRET=OiBZCOPCshgzSfjP463lOQ==
TRANSFER_TOKEN_SALT=GDVItCwRHtcEutohTqXwjw==
# Database
DATABASE_HOST=devopsmachine.eastus.cloudapp.azure.com
DATABASE_PORT=5432
DATABASE_NAME=strapi
DATABASE_USERNAME=strapi
DATABASE_PASSWORD=strapi
NODE_ENV=development
DATABASE_CLIENT=postgres
DATABASE_FILENAME=.tmp/data.db
JWT_SECRET=/VBqoDoo/HpskZu7hYqjPw==
-Projeyi ve dockerize dosyalarını build agentta veya kendi localinizde oluşturduktan sonra Azure DevOps’da açtığınız projenin repo’suna pushlabilirsiniz.
-Artık projeyi önce build edip sonra docker-compose ile ayağa kaldırabiliriz. Build işlemleri için Azure DevOps kullanacağım.
CI Pipeline’ın yaml formatı aşağıdaki gibi;
-Önce nexus repository’e login oluyoruz.
-Dockerfile build ediyoruz.
-Build edilen image tagliyoruz
-Nexus repository’e pushluyoruz.
-Docker-compose ile nexus’tan build ettiğimiz imajı ve postgresql imajını çekip uygulamayı ayağa kaldırıyoruz.
pool:
name: azure
steps:
- task: Docker@2
displayName: login
inputs:
containerRegistry: nexusrepo
command: login
- bash: 'docker build -t $(Build.Repository.Name):$(Build.BuildId) .'
displayName: 'docker build'
- bash: 'docker tag $(Build.Repository.Name):$(Build.BuildId) nexusrepo2.eastus.cloudapp.azure.com:8082/$(Build.Repository.Name):$(Build.BuildId)'
displayName: tag
- bash: 'docker push nexusrepo2.eastus.cloudapp.azure.com:8082/$(Build.Repository.Name):$(Build.BuildId)'
displayName: 'docker push nexus'
- task: DockerCompose@0
displayName: 'Run a Docker Compose command'
inputs:
containerregistrytype: 'Container Registry'
dockerRegistryEndpoint: nexusrepo
dockerComposeFile: 'docker-compose.yml'
dockerComposeCommand: 'up -d'
-Build alıyoruz ve sonuç;
-Url adresinden 1337 portunu kullanarak uygulamaya giriş yapıyoruz. Username ve Pass bilgilerini create edebilirsiniz.
-Strapi başarılı bir şekilde container üzerinde ayağa kalkmış durumda.