ඩොකර්: නරක උපදෙස් නොවේ

මගේ ලිපියට අදහස් දැක්වීමේදී ඩොකර්: නරක උපදෙස් එහි විස්තර කර ඇති Dockerfile මෙතරම් භයානක වන්නේ මන්දැයි පැහැදිලි කිරීමට බොහෝ ඉල්ලීම් තිබුණි.

කලින් කතාංගයේ සාරාංශය: සංවර්ධකයින් දෙදෙනෙකු දැඩි කාල සීමාවක් යටතේ ඩොකර් ගොනුවක් රචනා කරයි. මෙම ක්රියාවලියේදී, Ops Igor Ivanovich ඔවුන් වෙත පැමිණේ. එහි ප්‍රතිඵලය වන Dockerfile කොතරම් නරකද යත් AI හෘදයාබාධයක් අද්දර පවතී.

ඩොකර්: නරක උපදෙස් නොවේ

දැන් අපි බලමු මොකක්ද මේ Dockerfile එකේ වැරැද්ද කියලා.

ඉතින් සතියක් ගෙවිලා ගියා.

දේව් පෙටියා ඔප්ස් ඊගෝර් ඉවානොවිච්ව කෑම කාමරයේදී කෝපි කෝප්පයක් සමඟ මුණගැසෙනවා.

පි: ඊගෝර් ඉවානොවිච්, ඔබ ඉතා කාර්යබහුලද? මම කැමතියි අපි කොතනද කෙලෙව්වේ කියලා හොයාගන්න.

AI: ඒක හොඳයි, සූරාකෑම ගැන උනන්දුවක් දක්වන සංවර්ධකයින් ඔබට බොහෝ විට හමු නොවේ.
පළමුව, අපි කරුණු කිහිපයක් සමඟ එකඟ වෙමු:

  1. ඩොකර් දෘෂ්ටිවාදය: එක් බහාලුමක් - එක් ක්රියාවලියක්.
  2. කන්ටේනරය කුඩා වන තරමට වඩා හොඳය.
  3. ඔබ හැඹිලියෙන් ගන්නා තරමට වඩා හොඳය.

පි: එක් කන්ටේනරයක එක් ක්රියාවලියක් තිබිය යුත්තේ ඇයි?

AI: Docker, බහාලුමක් ආරම්භ කරන විට, pid 1 සමඟ ක්‍රියාවලියේ තත්වය නිරීක්ෂණය කරයි. ක්‍රියාවලිය මිය ගියහොත්, Docker කන්ටේනරය නැවත ආරම්භ කිරීමට උත්සාහ කරයි. අපි හිතමු ඔබ සතුව කන්ටේනරයක යෙදුම් කිහිපයක් ක්‍රියාත්මක වන බව හෝ ප්‍රධාන යෙදුම pid 1 සමඟ ක්‍රියාත්මක නොවේ. ක්‍රියාවලිය මිය ගියහොත්, ඩොකර් ඒ ගැන නොදනී.

ඔබට තවත් ප්‍රශ්න නොමැති නම්, කරුණාකර ඔබගේ Dockerfile අපට පෙන්වන්න.

සහ පෙටියා පෙන්වූයේ:

FROM ubuntu:latest

# Копируем исходный код
COPY ./ /app
WORKDIR /app

# Обновляем список пакетов
RUN apt-get update 

# Обновляем пакеты
RUN apt-get upgrade

# Устанавливаем нужные пакеты
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor

# Устанавливаем bundler
RUN gem install bundler

# Устанавливаем nodejs используется для сборки статики
RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash -
RUN apt-get install -y nodejs

# Устанавливаем зависимости
RUN bundle install --without development test --path vendor/bundle

# Чистим за собой кэши
RUN rm -rf /usr/local/bundle/cache/*.gem 
RUN apt-get clean 
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 
RUN rake assets:precompile
# Запускаем скрипт, при старте контейнера, который запустит все остальное.
CMD ["/app/init.sh"]

AI: ඔහ්, අපි එය පිළිවෙලට ගනිමු. අපි පළමු පේළියෙන් පටන් ගනිමු:

FROM ubuntu:latest

ඔයා ටැග් එක ගන්න latest. ටැග් එකක් භාවිතා කිරීම latest අනපේක්ෂිත ප්රතිවිපාකවලට තුඩු දෙයි. සිතන්න, රූපය නඩත්තු කරන්නා වෙනත් මෘදුකාංග ලැයිස්තුවක් සමඟ රූපයේ නව අනුවාදයක් ගොඩනඟයි, මෙම රූපයට නවතම ටැගය ලැබේ. ඔබේ කන්ටේනරය, හොඳම දේ, ගොඩනැගීම නතර කරයි, නරකම අවස්ථාවක, ඔබ කලින් නොතිබූ දෝෂ අල්ලා ගනී.

ඔබ අනවශ්‍ය මෘදුකාංග විශාල ප්‍රමාණයක් සහිත සම්පූර්ණ මෙහෙයුම් පද්ධතියක් සහිත රූපයක් ගන්නා අතර එමඟින් බහාලුම් පරිමාව වැඩි වේ. තවද මෘදුකාංග වැඩි වන තරමට සිදුරු සහ දුර්වලතා වැඩි වේ.

ඊට අමතරව, රූපය විශාල වන තරමට, එය සත්කාරකයේ සහ රෙජිස්ට්‍රියේ (ඔබ පින්තූර කොහේ හරි ගබඩා කරන්නේද) වැඩි ඉඩක් ගනීද?

පි: ඔව්, ඇත්ත වශයෙන්ම, අපට රෙජිස්ට්‍රියක් ඇත, ඔබ එය සකසා ඇත.

AI: ඉතින්, මම කතා කරන්නේ කුමක් ගැනද?.. ඔහ්, පරිමාවන් ... ජාලයේ බර ද වැඩිවෙමින් පවතී. තනි රූපයක් සඳහා මෙය සැලකිය යුතු නොවේ, නමුත් අඛණ්ඩ ගොඩනැගීම, පරීක්ෂණ සහ යෙදවීම ඇති විට, එය කැපී පෙනේ. ඔබට AWS මත දෙවියන්ගේ මාදිලිය නොමැති නම්, ඔබට විශ්වීය බිල්පතක් ද ලැබෙනු ඇත.

එමනිසා, ඔබ නිවැරදි අනුවාදය සහ අවම මෘදුකාංග සමඟ වඩාත් සුදුසු රූපය තෝරාගත යුතුය. උදාහරණයක් ලෙස, ගන්න: FROM ruby:2.5.5-stretch

පි: ඔහ්, මට පේනවා. පවතින පින්තූර මට බැලිය හැක්කේ කෙසේද සහ කොහේද? මට අවශ්‍ය එක කුමක්දැයි මා දන්නේ කෙසේද?

AI: සාමාන්‍යයෙන් පින්තූර ගන්නේ dockerhub, Pornhub සමග පටලවා ගන්න එපා :). රූපයක් සඳහා සාමාන්‍යයෙන් එකලස් කිරීම් කිහිපයක් තිබේ:
ඇල්පයින්: පින්තූර අවම ලිනක්ස් රූපයක් මත එකතු කරනු ලැබේ, 5 MB පමණි. එහි අවාසිය: එය තමන්ගේම libc ක්‍රියාත්මක කිරීම සමඟ සම්පාදනය කර ඇත, සම්මත පැකේජ එහි ක්‍රියා නොකරයි. අවශ්‍ය පැකේජය සොයා ගැනීමට සහ ස්ථාපනය කිරීමට බොහෝ කාලයක් ගතවනු ඇත.
සීරීම්: මූලික රූපය, වෙනත් රූප තැනීමට භාවිතා නොවේ. එය ද්විමය, සකස් කළ දත්ත ධාවනය කිරීම සඳහා පමණක් අදහස් කෙරේ. GO යෙදුම් වැනි ඔබට අවශ්‍ය සියල්ල ඇතුළත් ද්විමය යෙදුම් ධාවනය සඳහා වඩාත් සුදුසුය.
Ubuntu හෝ Debian වැනි ඕනෑම OS මත පදනම්ව. හොඳයි, මම සිතන්නේ පැහැදිලි කිරීමට අවශ්ය නැත.

AI: දැන් අපි සියලුම අමතර කොටස් ස්ථාපනය කළ යුතුයි. පැකේජ සහ ඔබගේ හැඹිලි ඉවත් කරන්න. තවද ඔබට එය වහාම විසි කළ හැකිය apt-get upgrade. එසේ නොමැතිනම්, එක් එක් ගොඩනැගීම සමඟ, මූලික රූපයේ ස්ථාවර ටැගය තිබියදීත්, විවිධ රූප ලබා ගනී. රූපයේ පැකේජ යාවත්කාලීන කිරීම නඩත්තු කරන්නාගේ කාර්යය වන අතර ටැගය වෙනස් කිරීමත් සමඟ සිදු වේ.

පි: ඔව්, මම එය කිරීමට උත්සාහ කළෙමි, එය මෙසේ විය:

WORKDIR /app
COPY ./ /app

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle

RUN rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

AI: නරක නැහැ, නමුත් වැඩ කිරීමට යමක් තිබේ. බලන්න, මෙන්න මේ විධානය:

RUN rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*  

... අවසාන රූපයෙන් දත්ත මකා නොදමනු ඇත, නමුත් මෙම දත්ත නොමැතිව අතිරේක ස්ථරයක් පමණක් නිර්මාණය කරයි. නිවැරදිව මේ වගේ:

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

නමුත් එය පමණක් නොවේ. ඔයාට මොනවද එතන තියෙන්නේ, Ruby? එවිට මුලදී සම්පූර්ණ ව්‍යාපෘතිය පිටපත් කිරීමට අවශ්‍ය නැත. Gemfile සහ Gemfile.lock පිටපත් කිරීම ප්රමාණවත්ය.

මෙම ප්‍රවේශය සමඟින්, සෑම මූලාශ්‍ර වෙනසක් සඳහාම බණ්ඩල් ස්ථාපනය ක්‍රියාත්මක නොවනු ඇත, නමුත් Gemfile හෝ Gemfile.lock වෙනස් වී ඇත්නම් පමණි.

පරායත්තතා ලැයිස්තුවක් සහිත ගොනුවක් මත පදනම්ව npm, pip, composer සහ වෙනත් යැපීම් කළමණාකරුවෙකු සහිත වෙනත් භාෂා සඳහා ද එම ක්‍රම ක්‍රියා කරයි.

අවසාන වශයෙන්, මතකද මම මුලදී කතා කළේ "එක් බහාලුමක් - එක් ක්‍රියාවලියක්" ගැන ඩොකර් මතවාදය ගැන? මෙයින් අදහස් කරන්නේ අධීක්ෂකවරයෙකු අවශ්ය නොවන බවයි. ඔබ එකම හේතු නිසා systemd ස්ථාපනය නොකළ යුතුය. මූලික වශයෙන්, ඩොකර් ම අධීක්ෂකයෙකි. තවද ඔබ එහි ක්‍රියාවලි කිහිපයක් ක්‍රියාත්මක කිරීමට උත්සාහ කරන විට, එය එක් අධීක්ෂක ක්‍රියාවලියක යෙදුම් කිහිපයක් ධාවනය කිරීම වැනිය.
ගොඩනඟන විට, ඔබ තනි රූපයක් සාදනු ඇත, ඉන්පසු එක් ක්රියාවලියක් ක්රියාත්මක වන පරිදි අවශ්ය බහාලුම් සංඛ්යාව දියත් කරන්න.

නමුත් පසුව ඒ ගැන වැඩි විස්තර.

පි: මම හිතන්නේ මට තේරෙනවා. මොකද වෙන්නේ කියලා බලන්න:

FROM ruby:2.5.5-stretch

WORKDIR /app
COPY Gemfile* /app

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

COPY . /app
RUN rake assets:precompile

CMD ["bundle”, “exec”, “passenger”, “start"]

කන්ටේනරය ආරම්භ කිරීමේදී අපට ඩීමන් දියත් කිරීම ප්‍රතික්ෂේප කළ හැකිද?

AI: ඔව්, ඒක හරි. මාර්ගය වන විට, ඔබට CMD සහ ENTRYPOINT යන දෙකම භාවිතා කළ හැකිය. වෙනස කුමක්දැයි සොයා බැලීම ඔබේ ගෙදර වැඩයි. Habré හි මෙම මාතෘකාව පිළිබඳ හොඳ එකක් තිබේ ලිපියක්.

ඉතින්, අපි ඉදිරියට යමු. ඔබ නෝඩ් ස්ථාපනය කිරීමට ගොනුවක් බාගන්න, නමුත් ඔබට අවශ්‍ය දේ එහි අඩංගු වන බවට සහතිකයක් නොමැත. අපි වලංගුකරණය එකතු කළ යුතුයි. උදාහරණයක් ලෙස, මේ වගේ:

RUN curl -sL https://deb.nodesource.com/setup_9.x > setup_9.x 
    && echo "958c9a95c4974c918dca773edf6d18b1d1a41434  setup_9.x" | sha1sum -c - 
    &&  bash  setup_9.x 
    && rm -rf setup_9.x 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

චෙක්සම් භාවිතා කිරීමෙන් ඔබ නිවැරදි ගොනුව බාගත කර ඇති බව තහවුරු කර ගත හැක.

පි: නමුත් ගොනුව වෙනස් වුවහොත්, ගොඩනැගීම අසාර්ථක වනු ඇත.

AI: ඔව්, සහ පුදුමයට කරුණක් නම්, මෙයද ප්ලස් වේ. ගොනුව වෙනස් වී ඇති බව ඔබ දැන ගනු ඇත, එහි වෙනස් වූ දේ ඔබට දැක ගත හැකි වනු ඇත. ඔබ කිසිදා නොදනී, ඔවුන් එයට ළඟා විය හැකි සියල්ල මකා දමන හෝ පසු දොරක් නිර්මාණය කරන ස්ක්‍රිප්ට් එකක් එකතු කර ඇත.

පි: ස්තූතියි. අවසාන ඩොකර් ගොනුව මේ ආකාරයෙන් පෙනෙනු ඇති බව පෙනේ:

FROM ruby:2.5.5-stretch

WORKDIR /app
COPY Gemfile* /app

RUN curl -sL https://deb.nodesource.com/setup_9.x > setup_9.x 
    && echo "958c9a95c4974c918dca773edf6d18b1d1a41434  setup_9.x" | sha1sum -c - 
    &&  bash  setup_9.x 
    && rm -rf setup_9.x 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

COPY . /app
RUN rake assets:precompile

CMD ["bundle”, “exec”, “passenger”, “start"]

පි: ඊගෝර් ඉවානොවිච්, ඔබගේ උදව්වට ස්තූතියි. මට දුවන්න වෙලාව හරි, මට අද තව කැපවීම් 10ක් කරන්න ඕන.

ඊගෝර් ඉවානොවිච්, ඔහුගේ ඉක්මන් සගයා ඔහුගේ බැල්මෙන් නවත්වා, ශක්තිමත් කෝපි උගුරක් ගනී. 99.9% SLA සහ bug-free code එක ගැන තත්පර කිහිපයක් කල්පනා කිරීමෙන් පසු ඔහු ප්‍රශ්නයක් අසයි.

AI: ඔබ ලඝු-සටහන් ගබඩා කරන්නේ කොහේද?

පි: ඇත්ත වශයෙන්ම, production.log හි. මාර්ගය වන විට, ඔව්, නමුත් අපට ssh නොමැතිව ඒවාට ප්‍රවේශ විය හැක්කේ කෙසේද?

AI: ඔබ ඒවා ලිපිගොනු වල තැබුවහොත්, ඔබ සඳහා විසඳුමක් දැනටමත් සොයාගෙන ඇත. docker exec විධානය මඟින් ඔබට බහාලුමක් තුළ ඕනෑම විධානයක් ක්‍රියාත්මක කිරීමට ඉඩ සලසයි. උදාහරණයක් ලෙස, ඔබට ලඝු-සටහන් සඳහා cat කරන්න පුළුවන්. සහ යතුර භාවිතා කිරීම -එය සහ ධාවන bash (කන්ටේනරයේ ස්ථාපනය කර ඇත්නම්) ඔබට කන්ටේනරයට අන්තර්ක්‍රියාකාරී ප්‍රවේශයක් ලබා දෙනු ඇත.

නමුත් ඔබ ලිපිගොනු වල ලොග් ගබඩා නොකළ යුතුය. අවම වශයෙන්, මෙය කන්ටේනරයේ පාලනයකින් තොරව වර්ධනය වීමට හේතු වන අතර, කිසිවෙකු ලොග් භ්රමණය නොකරයි. සියලුම ලඝු-සටහන් stdout වෙත යැවිය යුතුය. එහිදී ඒවා දැනටමත් විධානය භාවිතයෙන් නැරඹිය හැකිය ඩොකර් ලඝු-සටහන්.

P: Igor Ivanovich, සමහර විට මට ලොග් සවිකර ඇති බහලුමක, භෞතික නෝඩයක, පරිශීලක දත්ත ලෙස තැබිය හැකිද?

AI: නෝඩයේ තැටියට පටවා ඇති දත්ත ඉවත් කිරීමට ඔබ අමතක නොකළ බව හොඳයි. ඔබට ලඝු-සටහන් සමඟද මෙය කළ හැකිය, භ්රමණය සැකසීමට අමතක නොකරන්න.
එච්චරයි, ඔබට දුවන්න පුළුවන්.

පි: ඊගෝර් ඉවානොවිච්, ඔබට කියවිය යුතු දේ මට උපදෙස් දිය හැකිද?

AI: පළමුව, කියවන්න ඩොකර් සංවර්ධකයින්ගේ නිර්දේශ, ඩොකර්ව ඔවුන්ට වඩා හොඳින් දන්නා කිසිවෙක් නැති තරම්ය.

ඔබට සීමාවාසික පුහුණුවක් ලබා ගැනීමට අවශ්‍ය නම්, යන්න දැඩි. ඇත්ත වශයෙන්ම, ප්රායෝගිකව නොමැති න්යාය මිය ගොස් ඇත.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න