# Загрузить базовый образ
FROM node:12-alpine
# Скопировать файлы из текущей директории в директорию app/
COPY . app/
# Использовать app/ в роли рабочей директории
WORKDIR app/
# Установить зависимости (команда npm ci похожа npm i, но используется для автоматизированных сборок)
RUN npm ci --only-production
# Собрать клиентское React-приложение для продакшна
RUN npm run build
# Прослушивать указанный порт
EXPOSE 5000
# Запустить Node-сервер
ENTRYPOINT npm run start
د بیس عکس پورې اړه لري چې تاسو یې غوره کوئ، تاسو ممکن د اضافي انحصارونو نصبولو ته اړتیا ولرئ. حقیقت دا دی چې ځینې بیس عکسونه (لکه نوډ الپین لینکس) د دې هدف سره رامینځته شوي چې دوی د امکان تر حده کمپیکٹ کړي. د پایلې په توګه، دوی ممکن ځینې پروګرامونه ونه لري چې تاسو یې تمه لرئ.
▍ د کانتینر جوړول، ټګ کول او چلول
سیمه ایز مجلس او د کانټینر پیل کول زموږ څخه وروسته دي Dockerfile، دندې خورا ساده دي. مخکې لدې چې تاسو عکس ډاکر هب ته فشار ورکړئ ، تاسو اړتیا لرئ دا په ځایی ډول ازموینه وکړئ.
▍ مجلس
لومړی تاسو اړتیا لرئ راټول کړئ انځور، د نوم مشخص کول او په اختیاري توګه یو ټاګ (که چیرې ټاګ مشخص نه وي ، سیسټم به په اوتومات ډول عکس ته ټاګ وټاکي latest).
# Запуск с использованием локального порта 5000 и порта контейнера 5000
docker run -p 5000:5000 <image>:<tag>
اوس چې کانټینر رامینځته شوی او روان دی ، تاسو کولی شئ کمانډ وکاروئ docker ps د دې کانټینر په اړه معلومات وګورئ (یا تاسو کولی شئ کمانډ وکاروئ docker ps -a، کوم چې د ټولو کانټینرونو په اړه معلومات ښیې ، نه یوازې د چلونکي).
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
987654321234 <image> "/bin/sh -c 'npm run…" 6 seconds ago Up 6 seconds 0.0.0.0:5000->5000/tcp stoic_darwin
docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>
# На практике это может выглядеть, например, так:
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0
که هرڅه سم وي ، عکس به په ډاکر هب کې شتون ولري او په اسانۍ سره سرور ته اپلوډ کیدی شي یا نورو پراختیا کونکو ته لیږدول کیدی شي.
راتلونکی ګامونه
تر دې دمه موږ تایید کړی چې غوښتنلیک ، د ډاکر کانټینر په شکل کې په ځایی ډول پرمخ ځي. موږ کانټینر ډاکر هب ته پورته کړی دی. دا ټول پدې معنی دي چې موږ لا دمخه د خپل هدف په لور خورا ښه پرمختګ کړی دی. اوس موږ باید دوه نورې پوښتنې حل کړو:
د کوډ ازموینې او پلي کولو لپاره د CI وسیله تنظیم کول.
د تولید سرور تنظیم کول ترڅو دا زموږ کوډ ډاونلوډ او چلولی شي.
دا باید په یاد ولرئ چې دلته تاسو کولی شئ د خدماتو بل ترکیب وکاروئ. د مثال په توګه، د Travis CI پرځای، تاسو کولی شئ د CircleCI یا Github اعمال وکاروئ. او د ډیجیټل اوسین - AWS یا Linode پرځای.
موږ پریکړه وکړه چې د Travis CI سره کار وکړو، او ما دمخه په دې خدمت کې یو څه ترتیب کړی دی. له همدې کبله، زه به په لنډه توګه د کار لپاره د چمتو کولو څرنګوالي په اړه خبرې وکړم.
Travis CI
Travis CI د کوډ ازموینې او پلي کولو لپاره وسیله ده. زه نه غواړم د ټریوس CI تنظیم کولو پیچلتیاو ته لاړ شم ، ځکه چې هره پروژه ځانګړې ده ، او دا به ډیره ګټه ونه کړي. مګر زه به تاسو د پیل کولو لپاره اساسات پوښم که تاسو پریکړه وکړئ چې د Travis CI وکاروئ. که تاسو Travis CI، CircleCI، Jenkins، یا بل څه غوره کړئ، د ورته ترتیب کولو میتودونه به هرچیرې وکارول شي.
د Travis CI سره پیل کولو لپاره، لاړ شئ ویب پاڼه او یو حساب جوړ کړئ. بیا د خپل GitHub حساب سره Travis CI مدغم کړئ. کله چې سیسټم تنظیم کړئ، تاسو به اړتیا ولرئ هغه ذخیره مشخص کړئ چې تاسو یې غواړئ کار اتومات کړئ او دې ته لاسرسی وړ کړئ. (زه GitHub کاروم، مګر زه ډاډه یم چې Travis CI کولی شي د BitBucket، او GitLab، او نورو ورته خدماتو سره یوځای شي).
د Travis CI ترتیب کولو فایل نومیږي .travis.yml او د پروژې روټ ډایرکټر کې زیرمه شوي، د پیښو مفهوم ملاتړ کوي دژوند دوران دندې دا پیښې په هغه ترتیب کې لیست شوي چې واقع کیږي:
apt addons
cache components
before_install
install
before_script
script
before_cache
after_success или after_failure
before_deploy
deploy
after_deploy
after_script
▍ ازمایښت
د ترتیب کولو فایل کې زه د محلي ټریوس CI سرور تنظیم کوم. ما نوډ 12 د ژبې په توګه غوره کړ او سیسټم ته یې وویل چې د ډاکر کارولو لپاره اړین انحصارونه نصب کړي.
هرڅه چې په کې لیست شوي دي .travis.yml، به اجرا شي کله چې د ذخیره کولو ټولو څانګو ته ټولې پلې غوښتنې وشي ، پرته لدې چې بل ډول مشخص شي. دا یو ګټور خصوصیت دی ځکه چې دا پدې مانا ده چې موږ کولی شو ټول کوډ معاینه کړو چې ذخیره ته راځي. دا تاسو ته اجازه درکوي پوه شئ چې کوډ چمتو دی چې څانګې ته ولیکل شي. master، او ایا دا به د پروژې د جوړولو پروسه مات کړي. پدې نړیوال ترتیب کې ، زه هرڅه په ځایی ډول نصب کوم ، په شالید کې د Webpack dev سرور چلوم (دا زما د کاري فلو ځانګړتیا ده) ، او ازموینې پرمخ وړم.
که تاسو غواړئ چې ستاسو ذخیره د ازموینې پوښښ عکسونه ښکاره کړي، دلته تاسو کولی شئ د دې معلوماتو راټولولو او ښودلو لپاره د Jest، Travis CI او Coveralls کارولو په اړه لنډ لارښوونې ومومئ.
نو دلته د فایل مینځپانګه ده .travis.yml:
# Установить язык
language: node_js
# Установить версию Node.js
node_js:
- '12'
services:
# Использовать командную строку Docker
- docker
install:
# Установить зависимости для тестов
- npm ci
before_script:
# Запустить сервер и клиент для тестов
- npm run dev &
script:
# Запустить тесты
- npm run test
دا هغه ځای دی چې هغه کړنې چې د ذخیره ټولو څانګو لپاره ترسره کیږي او د پلولو غوښتنو لپاره پای ته رسیږي.
نو ، د سکریپټ لومړۍ برخه د ډاکر هب ته عکس اپلوډ کوي. دا کار کول خورا اسانه دي. د ټاګ کولو سکیم چې ما کارولی د git هش او git ټاګ ترکیب کول شامل دي ، که یو شتون ولري. دا ډاډ ورکوي چې ټاګ ځانګړی دی او د هغه مجلس پیژندنه اسانه کوي چې پر اساس یې وي. DOCKER_USERNAME и DOCKER_PASSWORD د کارن چاپیریال متغیرونه دي چې د Travis CI انٹرفیس په کارولو سره تنظیم کیدی شي. Travis CI به په اوتومات ډول حساس معلومات پروسس کړي ترڅو دا غلط لاسونو ته ونه رسیږي.
دلته د سکریپټ لومړۍ برخه ده deploy.sh.
#!/bin/sh
set -e # Остановить скрипт при наличии ошибок
IMAGE="<username>/<repository>" # Образ Docker
GIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-хэш и теги
# Сборка и тегирование образа
docker build -t ${IMAGE}:${GIT_VERSION} .
docker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest
# Вход в Docker Hub и выгрузка образа
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
docker push ${IMAGE}:${GIT_VERSION}
د سکریپټ دویمه برخه به څه وي په بشپړ ډول په هغه کوربه پورې اړه لري چې تاسو یې کاروئ او څنګه ورسره اړیکه تنظیم شوې. زما په قضیه کې، له هغه وخته چې زه ډیجیټل سمندر کاروم، زه د سرور سره د نښلولو لپاره امرونه کاروم doctl. کله چې د AWS سره کار کوئ، دا به کارول کیږي aws، او همداسی پسی.
د سرور تنظیم کول په ځانګړي ډول ستونزمن ندي. نو ، ما د بیس عکس پراساس یو څاڅکی تنظیم کړ. دا باید په یاد ولرئ چې هغه سیسټم چې ما غوره کړی د ډاکر یو ځل لاسي نصب او د ډاکر یو ځل لاسي لانچ ته اړتیا لري. ما د ډاکر نصبولو لپاره اوبنټو 18.04 کارولی، نو که تاسو د ورته کولو لپاره اوبنټو هم کاروئ، تاسو کولی شئ یوازې تعقیب کړئ دا ساده لارښود.
زه دلته د خدمت لپاره د ځانګړو حکمونو په اړه خبرې نه کوم، ځکه چې دا اړخ په مختلفو قضیو کې خورا توپیر کولی شي. زه به یوازې د عمل عمومي پلان ورکړم چې د SSH له لارې سرور سره وصل کیدو وروسته ترسره کیږي چیرې چې پروژه به ځای په ځای شي:
موږ اړتیا لرو هغه کانټینر ومومئ چې اوس مهال روان دی او ودروي.
# Найти ID работающего контейнера
CONTAINER_ID=$(docker ps | grep takenote | cut -d" " -f1)
# Остановить старый контейнер, запустить новый, очистить систему
docker stop ${CONTAINER_ID}
docker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}
docker system prune -a -f
ځینې شیان باید پاملرنه وکړي
دا ممکنه ده کله چې تاسو د Travis CI څخه د SSH له لارې سرور سره وصل شئ، نو تاسو به یو خبرداری وګورئ چې تاسو به د نصب کولو سره د دوام مخه ونیسي ځکه چې سیسټم به د کارونکي ځواب ته انتظار وکړي.
The authenticity of host '<hostname> (<IP address>)' can't be established.
RSA key fingerprint is <key fingerprint>.
Are you sure you want to continue connecting (yes/no)?
ما زده کړل چې د تار کیلي په بیس 64 کې کوډ کیدی شي ترڅو دا په داسې شکل کې خوندي کړي چې په اسانۍ او د اعتماد سره کار کیدی شي. د نصب کولو په مرحله کې، تاسو کولی شئ عامه کیلي ډیکوډ کړئ او فایل ته یې ولیکئ known_hosts د پورته تېروتنې څخه د خلاصون لپاره.