Бәріңе сәлем. Біз сіздің жобаңызды жазу туралы мақалалар сериясын жалғастырамыз.
Бұтақтарды сұрыптаңыз
Ең бастысы, фorалдар мен репозиторийдегі олардың тәртібін жоғалтып алмау үшін мен STEP_{number} префиксін қосу арқылы олардың атын өзгертуді шештім . Мысалы, бізде негізгіден басқа үш фorал бар:- JRTB-0
- JRTB-2
- JRTB-3
- STEP_1_JRTB-0 - бірінші қадам
- STEP_2_JRTB-2 – екінші қадам
- STEP_3_JRTB-3 - үшінші қадам
Докер туралы аздап
Docker дегеніміз не? Бір сөзбен айтқанда, бұл қосымшаларды тез және қауіпсіз орналастыруға (орналастыруға), олар үшін жабық инфрақұрылымды жасауға, тек соларға ғана қажет құрал. Бұл әлі қиын, мен түсінемін. Жалпы алғанда, Docker тез және тиімді жұмыс істей алатын әзірлеу платформасы ретінде түсінуге болады. Докерді serverде жұмыс істейтін бағдарлама деп түсінуге болады. Бұл бағдарламаның қолданбалы контейнерлерді сақтау мүмкіндігі бар. Контейнер дегеніміз не? Бұл жеке инфрақұрылым, оған қажеттінің барлығын қосуға болады. Мысалы, Java қолданбасы үшін қосымшаны іске қосу үшін бізге JRE керек, контейнерде бұл болады, бізге басқа бағдарламалық жасақтама қажет болады - біз мұны қоса аламыз. Немесе бізге Linux және Tomcat сервлет контейнері қажет болуы мүмкін. Мұны да жасауға болады. Контейнерлер кескін негізінде жасалады: яғни бұл Docker контейнерін жасауға қажеттінің барлығын қамтитын арнайы үлгі. Бұл суретті қалай жасауға болады? Біздің жағдайда контейнерде не болуы керек екенін сипаттайтын жобаның түбірінде Dockerfile жасау керек болады. Біз бот таңбалауышын кез келген жерде көрсеткіміз келмейтіндіктен, қолданбаны орналастырғымыз келген сайын оны жіберуге жүгінуіміз керек. Бұл тақырып туралы толығырақ мына жерден және мына жерден оқи аласыз .Біз JRTB-13 жазамыз
Қолданбамыз үшін serverге жылдам және оңай орналастыру процесін орнатуымыз керек. Яғни, тәулік бойы жұмыс істейтін машина үшін. Докерді негізге алайық. Бірақ біздің тізімде бұл функцияны қосуға жауап беретін тапсырма жоқ. Оны жасау кезінде әйтеуір сағындым. Мәселе жоқ, оны қазір жасаймыз. GitHub жүйесінде мәселені жасау қойындысына өтіп , «Мүмкіндік сұрауы» тармағын таңдаңыз: Тапсырманың сипаттамасын, оны қабылдау критерийлерін қосыңыз, бұл мәселе қай жобаға жататынын орнатыңыз және жаңа шығарылымды жасай аласыз: Енді тапсырма қабылданғанын көрсету үшін жұмыс үшін тапсырманың күйін Орындалуда деп өзгертіңіз: Бұл қиын мақала болады. Егер сізде қандай да бір проблемалар болса, түсініктемелерде жазыңыз: Мен оларды қадағалап, мүмкіндігімше жауап беремін. Бұл шағын тұтынушыларды қолдау қызметі болады: DDocker файлын жасау
Докер файлы дегеніміз не? Docker үшін бұл Docker контейнері үшін суретті қалай жасау керектігі туралы сценарий (қадамдық нұсқаулар). Қолданбамыз жұмыс істеуі үшін бізге JDK, 11 нұсқасы қажет. Яғни, JDK 11 докер кескінін тауып, оны суретімізге қосуымыз керек. Бұл жадқа тәуелділікті қалай қосуымызға ұқсас нәрсе. Бұл мақсат үшін Docker бағдарламасында DockerHub бар . Суреттерді жергілікті түрде жүктеп алу үшін сол жерде тіркелу керек. Тіркелгеннен кейін JDK11 іздейік. Менің тапқанымнан бұл контейнер: acceptopenjdk/openjdk11 . Бұл контейнердің сипаттамасында докер файлы үшін қажет нәрсе бар:FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
Jar файлын алатын қалтаны түзетейік. mvn пакеті maven тапсырмасын іске қосқаннан кейін біз оны мақсатты қалтада аламыз. Осының бәрін жасамас бұрын, жаңартылған негізгі тармаққа негізделген біз тапсырмамыз үшін жаңасын жасаймыз: STEP_4_JRTB-13 . Енді сіз жұмыс істей аласыз. Жобаның түбірінде Dockerfile кеңейтімі жоқ файл жасаңыз және ішіне келесіні қосыңыз:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Бірінші жол кескіннің негізінде болатыны - acceptopenjdk/openjdk11. Екінші жол мақсатты қалтада орналасқан JAR_FILE деп аталатын кескінге аргумент қосу. Сонымен қатар, ағымдағы қалта Dockerfile орнымен анықталады. Үшінші жол - жобамыздың банкасын докер кескініне көшіріңіз. Соңғы жолда негізінен бос орынмен бөлінген терминалдағы пәрменнен жасалған массив бар. Яғни, соңында мыналар орындалады: “java -jar /app.jar” Бот таңбалауышын құпия сақтау үшін контейнерді іске қосқан кезде бізге екі айнымалыны – бот атауын және оның таңбалауышын беру керек. Бұл әрекетті орындау үшін, біз айнымалылармен жобамызды іске қосу керек сұрау жазамыз. Және оны қалай жасауға болады? Сізге оны Google арқылы іздеу керек: мұнда қалыпты сипаттамасы бар бірінші сілтеме . Біз не істегіміз келеді? application.properties файлында біз анықтайтын екі айнымалы бар:
- bot.username
- bot.token
- Bash сценарийін іске қосайық.
- Bash сценарийі docker-compose бағдарламасын іске қосады.
- Docker-compose біздің қолданбамызбен докер контейнерін іске қосады.
- Docker контейнері біздің қолданбаны іске қосады.
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}", "-jar", "/app.jar"]
Екі жолды қосып, ENTRYPOINT жаңартылғанын көруге болады. Сызықтар:
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
codeер файлының ішінде айнымалы мәндерді жариялау. Әдепкі бойынша оларда көрсетілген мән бар. Егер осы докер-файлдан кескін жасау кезінде осындай атаулары бар орта айнымалылары берілсе, мәндер басқаша болады. ENTRYPOINT ішінде біз осы орта айнымалы мәндерін оқитын тағы бірнеше элементтерді қостық:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
Мұнда ${} конструкциясы арқылы жолдың ішінде BOT_NAME және BOT_TOKEN мәндері берілетінін көруге болады. Әрі қарай, біз бұл айнымалы мәндерді докер-композитке қабылдауды және беруді үйретуіміз керек.
docker-compose.yml жасаңыз
Сізге YAML пішімі туралы бөлек оқығаныңыз жақсы болар еді, әйтпесе мақала қазірдің өзінде секіріспен өсіп келеді. Біз үшін бұл .properties түріндегі айнымалылардың тағы бір сипаттамасы ғана. Тек қасиеттерде ол нүкте арқылы жазылады, бірақ YAML-де бұл сәл әдемірек жасалады. Мысалы, осылай. .properties ішіндегі екі айнымалы мән: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin Бірақ .yaml ішінде (.yml сияқты) ол келесідей болады:javarush:
telegram:
bot:
name: ivan
token: pupkin
Екінші нұсқа әдемі және түсінікті. Бос орындар дәл жоғарыда көрсетілгендей болуы керек. Әйтеуір application.properties және application.yml файлдарын аударайық. Алдымен оны жасау керек. Жобаның түбірінде docker-compose.yml файлын жасаңыз және сол жерге келесіні жазыңыз:
version: '3.1'
services:
jrtb:
build:
context: .
environment:
- BOT_NAME=${BOT_NAME}
- BOT_TOKEN=${BOT_TOKEN}
restart: always
Бірінші жол - docker-compose нұсқасы. қызметтер: осыдан кейінгі барлық жолдар (жылжытылатын) біз конфигурациялап жатқан қызметтерге қатысты екенін айтады. Бізде осылардың біреуі ғана бар - jrtb деп аталатын java қолданбасы . Оның астында оның барлық параметрлері болады. Мысалы, құрастыру: контекст: . Dockerfile файлын docker-compose.yml каталогында іздейтінімізді айтады. Бірақ орта: бөлімі Dockerfile файлына қажетті орта айнымалы мәндерін беруімізге жауапты болады. Бізге керек нәрсе. Сондықтан біз төменде айнымалыларды өткіземіз. Docker-compose оларды serverдің жұмыс ортасының айнымалы мәндерінен іздейді. Оларды bash сценарийіне қосамыз.
Bash сценарийлерін жасау
Соңғы қадам - bash сценарийін жасау. Жобаның түбірінде start.sh деп аталатын файлды жасаңыз және сол жерге келесіні жазыңыз:#!/bin/bash
# Pull new changes
git pull
# Prepare Jar
mvn clean
mvn package
# Ensure, that docker-compose stopped
docker-compose stop
# Add environment variables
export BOT_NAME=$1
export BOT_TOKEN=$2
# Start new deployment
docker-compose up --build -d
Бірінші жол барлық bash сценарийлері үшін қажет: онсыз ол жұмыс істемейді. Содан кейін - терминалдағы орындалуы қажет командалар жиынтығы. Мен әр пәрменге түсініктемелер қостым, сондықтан түсінікті болуы керек. Мен түсіндіргім келетін жалғыз нәрсе - $1 және $2 дегенді білдіреді. Бұл bash сценарийі іске қосылғанда берілетін екі айнымалы мән. Экспорттау пәрменін пайдалану арқылы олар server айнымалыларына қосылады және docker-compose ішінде оқылады. Бұл Ubuntu үшін жұмыс істейді, мүмкін Windows үшін емес, бірақ мен сенімді емеспін. Енді жұмысты тоқтататын stop.sh сценарийін қосу керек. Ол бірнеше жолдардан тұрады:
#!/bin/bash
# Ensure, that docker-compose stopped
docker-compose stop
# Ensure, that the old application won't be deployed again.
mvn clean
Мұнда біз соңғы құрастырудан бері жалғасып келе жатқан jarnik жобасын docker-compose тоқтатамыз және тазартамыз. Біз мұны жобамыздың дұрыс қайта құруын қамтамасыз ету үшін жасаймыз. Прецеденттер болды, сондықтан мен қосып отырмын) Нәтижесінде біз 4 жаңа файлды аламыз:
- Dockerfile – қолданбамыздың суретін жасауға арналған файл;
- docker-compose.yml - контейнерлерімізді іске қосудың параметрлері бар файл;
- start.sh - қолданбамызды орналастыруға арналған bash сценарийі;
- stop.sh - бұл қолданбаны тоқтатуға арналған bash сценарийі.
# Шығарылым ескертпесі ## 0.3.0-SNAPSHOT * JRTB-13: жобаға қосу процесі ## 0.2.0-SNAPSHOT * JRTB-3: Telegram Bot пәрмендерін өңдеуге арналған орындалған пәрмен үлгісі ## 0.1.0-SNAPSHOT * JRTB -2: қосымша телеграмма боты қосылды * JRTB-0: SpringBoot қаңқа жобасы қосылды
README ішінде біз қосымшаны қалай орналастыру керектігін сипаттайтын жаңа абзац қосамыз:
## Орналастыру Орналастыру процесі мүмкіндігінше оңай: Қажетті бағдарламалық құрал: - bash сценарийлерін іске қосу үшін терминал - докер - қолданбаны орналастыру үшін докер-құрастыру, қажетті тармаққа ауысу және bash сценарийін іске қосу: $ bash start.sh ${bot_username} ${bot_token } Бар болғаны.
Әрине, барлығы ағылшын тілінде жазылған. Әдеттегідей, жаңадан құрылған STEP_4_JRTB-13 фorалында біз атымен жаңа міндеттеме жасаймыз: JRTB-13: орналастыру процесін докер арқылы жүзеге асырып , оны итеріңіз. Мен алдыңғы мақалаларда сипатталған нәрселерге егжей-тегжейлі тоқталуды тоқтатамын. Мен бір нәрсені қайталаудың мәнін көрмеймін. Оның үстіне ойлап тауып, өзі жасағандарға сұрақ болмайды. Бұл мен жаңа фorалды қалай жасау керектігі, міндеттемені қалай жасау керектігі, репозиторийге міндеттемені қалай итеру керектігі туралы айтып отырмын.
GO TO FULL VERSION