Docker: αžŠαŸ†αž”αžΌαž“αŸ’αž˜αžΆαž“αž˜αž·αž“αž›αŸ’αž’

Docker: αžŠαŸ†αž”αžΌαž“αŸ’αž˜αžΆαž“αž˜αž·αž“αž›αŸ’αž’

αž–αŸαž›αžαŸ’αž‰αž»αŸ†αžšαŸ€αž“αž”αžΎαž€αž‘αžΆαž“ αž“αŸ…αž˜αŸαžšαŸ€αž“αžŠαŸ†αž”αžΌαž„ αž‚αŸ’αžšαžΌαž”αžΎαž€αž‘αžΆαž“αž…αžΌαž›αž•αŸ’αž›αžΌαžœαž”αŸ’αžšαžŸαž–αŸ’αžœαž”αž‰αŸ’αž…αŸ’αžšαžΆαžŸ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž“αž·αž™αžΆαž™αžαžΆαž’αŸ’αž“αž€αž˜αž·αž“αž‚αž½αžšαž’αŸ’αžœαžΎαž”αŸ‚αž”αž“αŸαŸ‡αž‘αŸ - αž˜αž·αž“αžŠαŸ‚αž›αž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡αŸ” αžαŸ’αž‰αž»αŸ†αž“αžΉαž€αžƒαžΎαž‰αž…αŸ’αž”αžΆαž”αŸ‹αž“αŸαŸ‡αž—αŸ’αž›αžΆαž˜αŸ— αž“αž·αž„αž–αŸαž‰αž˜αž½αž™αž‡αžΈαžœαž·αžαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αŸ”

αž’αŸ’αž“αž€αž”αžΆαž“αž’αžΆαž“ "αžŠαŸ†αž”αžΌαž“αŸ’αž˜αžΆαž“αž˜αž·αž“αž›αŸ’αž’" αžŠαŸ„αž™ Grigory Oster αžŠαž›αŸ‹αž€αž»αž˜αžΆαžš αž αžΎαž™αž’αŸ’αž“αž€αžƒαžΎαž‰αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αžŠαŸ„αž™αž’αž˜αŸ’αž˜αž‡αžΆαžαž· αžœαžΆαž—αŸ’αž›αžΊαž‘αžΎαž„αž›αžΎαž–αž½αž€αž‚αŸαžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž˜αž·αž“αž‚αž½αžšαž’αŸ’αžœαžΎαž”αŸ‚αž”αž“αŸαŸ‡αŸ”

αž’αžαŸ’αžαž”αž‘αž‡αžΆαž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŸαžšαžŸαŸαžš Dockerfile αž±αŸ’αž™αž”αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŸαžšαžŸαŸαžš Dockerfiles αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž‘αŸαŸ” αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αž”αŸ†αž–αŸαž‰αž…αž“αŸ’αž›αŸ„αŸ‡αž“αŸαŸ‡αŸ” αž αžΎαž™αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžš αž“αžΉαž„αž˜αžΆαž“αž―αž€αžŸαžΆαžš dockerfiles αž”αŸ‚αž”αž“αŸαŸ‡αžαž·αž…αž‡αžΆαž„αž˜αž»αž“αŸ”

αžαž½αž’αž„αŸ’αž‚ αžŸαŸ’αžαžΆαž“αž—αžΆαž– αž“αž·αž„ Dockerfile αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαž”αŸ’αžšαžŒαž·αžαŸ” αž”αžΎαžŸαŸ’αž‚αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αž―αž„ αžŸαž»αŸ†αž‘αŸ„αžŸαŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž Dockerfile, αž’αžΆαž€αŸ’αžšαž€αŸ‹ αž“αž·αž„αž‚αž½αžšαž±αŸ’αž™αž—αŸαž™αžαŸ’αž›αžΆαž…

Peter (Senior java/rubby/php developer): αžŸαž αžŸαŸαžœαž·αž€ Vasily αžαžΎαž’αŸ’αž“αž€αž”αžΆαž“αž’αžΆαž”αŸ‹αž‘αžΌαžαž˜αŸ‰αžΌαžŒαž»αž›αžαŸ’αž˜αžΈαž‘αŸ… Docker αžšαž½αž…αž αžΎαž™αž¬αž“αŸ…?
Vasily (junior)αŸ– αž‘αŸ αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž˜αžΆαž“αž–αŸαž›αž‘αŸ αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž’αžΆαž…αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™ Docker αž“αŸαŸ‡αž”αžΆαž“αž‘αŸαŸ” αž˜αžΆαž“β€‹αž’αžαŸ’αžαž”αž‘β€‹αž‡αžΆβ€‹αž…αŸ’αžšαžΎαž“β€‹αž“αŸ…β€‹αž›αžΎβ€‹αžœαžΆ αžœαžΆβ€‹αžœαž·αž›β€‹αž˜αž»αžαŸ”

αž–αŸαžαŸ’αžšαž»αžŸαŸ– αž™αžΎαž„β€‹αž˜αžΆαž“β€‹αž€αžΆαž›β€‹αž€αŸ†αžŽαžαŸ‹β€‹αž€αžΆαž›β€‹αž–αžΈβ€‹αž˜αž½αž™β€‹αž†αŸ’αž“αžΆαŸ†β€‹αž˜αž»αž“αŸ” αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž‡αž½αž™αž’αŸ’αž“αž€ αž™αžΎαž„αž“αžΉαž„αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αŸ” αž”αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αŸ”

VasilyαŸ– αžαŸ’αž‰αž»αŸ†β€‹αž˜αž·αž“β€‹αž’αžΆαž…β€‹αž‡αŸ’αžšαžΎαžŸβ€‹αžšαžΎαžŸβ€‹αžšαžΌαž”αž—αžΆαž–β€‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž±αŸ’αž™β€‹αžœαžΆβ€‹αž˜αžΆαž“β€‹αžαž·αž…αžαž½αž…β€‹αž”αŸ†αž•αž»αžβ€‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž˜αžΆαž“β€‹αž’αŸ’αžœαžΈβ€‹αž‚αŸ’αžšαž”αŸ‹β€‹αž™αŸ‰αžΆαž„β€‹αžŠαŸ‚αž›β€‹αž’αŸ’αž“αž€β€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšαŸ”
αž–αŸαžαŸ’αžšαž»αžŸαŸ– αž™αž€αžšαžΌαž”αž—αžΆαž–αž’αŸŠαžΌαž”αŸŠαž»αž“αž‘αžΌ αžœαžΆαž˜αžΆαž“αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ” αž αžΎαž™β€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž˜αž·αž“β€‹αž…αžΆαŸ†β€‹αž”αžΆαž…αŸ‹β€‹αž…αŸ’αžšαžΎαž“β€‹αž“αžΉαž„β€‹αž˜αž€β€‹αž‡αžΆβ€‹αž”αŸ’αžšαž™αŸ„αž‡αž“αŸβ€‹αž“αŸ…β€‹αž–αŸαž›β€‹αž€αŸ’αžšαŸ„αž™αŸ” αž αžΎαž™αž€αž»αŸ†αž—αŸ’αž›αŸαž…αžŠαžΆαž€αŸ‹αžŸαŸ’αž›αžΆαž€αž…αž»αž„αž€αŸ’αžšαŸ„αž™αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαž‡αžΆαž“αž·αž…αŸ’αž…αŸ”

αž αžΎαž™αž”αž“αŸ’αž‘αžΆαžαŸ‹αž‘αžΈαž˜αž½αž™αž›αŸαž…αž‘αžΎαž„αž€αŸ’αž“αž»αž„ Dockerfile:

FROM ubuntu:latest

αž–αŸαžαŸ’αžšαž»αžŸαŸ– αžαžΎαž˜αžΆαž“αž’αŸ’αžœαžΈαž”αž“αŸ’αž‘αžΆαž”αŸ‹ αžαžΎαž™αžΎαž„αž”αŸ’αžšαžΎαž’αŸ’αžœαžΈαžŠαžΎαž˜αŸ’αž”αžΈαžŸαžšαžŸαŸαžšαž˜αŸ‰αžΌαžŒαž»αž›αžšαž”αžŸαŸ‹αž™αžΎαž„?
Vasily: αžŠαžΌαž…αŸ’αž“αŸαŸ‡ ruby β€‹β€‹αž˜αžΆαž“ web server αž αžΎαž™αžŠαŸαž˜αž·αž“αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž–αžΈαžšαž”αžΈαž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”
αž–αŸαžαŸ’αžšαž»αžŸαŸ– αž”αžΆαž‘ αžαžΎβ€‹αž™αžΎαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αž’αŸ’αžœαžΈαŸ– ruby, bundler, nodejs, imagemagick αž“αž·αž„β€‹αž’αŸ’αžœαžΈβ€‹αž•αŸ’αžŸαŸαž„β€‹αž‘αŸ€αž... αž αžΎαž™β€‹αž€αŸ’αž“αž»αž„β€‹αž–αŸαž›β€‹αž‡αžΆαž˜αž½αž™β€‹αž‚αŸ’αž“αžΆβ€‹αž“αŸαŸ‡ αž’αŸ’αžœαžΎβ€‹αž€αžΆαžšβ€‹αž’αžΆαž”αŸ‹αžŠαŸαžβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž‘αž‘αž½αž›β€‹αž”αžΆαž“β€‹αž€αž‰αŸ’αž…αž”αŸ‹β€‹αžαŸ’αž˜αžΈαŸ”
VasilyαŸ– αž αžΎαž™β€‹αž™αžΎαž„β€‹αž“αžΉαž„β€‹αž˜αž·αž“β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž€αž»αŸ†β€‹αž²αŸ’αž™β€‹αž™αžΎαž„β€‹αžŸαŸ’αžαž·αžβ€‹αž“αŸ…β€‹αž€αŸ’αžšαŸ„αž˜β€‹αž«αžŸ?
αž–αŸαžαŸ’αžšαž»αžŸαŸ– αž‡αž”αŸ‹αžœαžΆ αž’αž‰αŸ’αž…αžΉαž„αž’αŸ’αž“αž€αž“αŸ…αžαŸ‚αžαŸ’αžšαžΌαžœαž”αŸ„αž€αž”αž‰αŸ’αž†αŸ„αžαžŠαŸ„αž™αžŸαž·αž‘αŸ’αž’αž·αŸ”
Vasily: αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž€αžΆαžšαž–αŸαž›αžœαŸαž›αžΆαž”αŸ’αžšαž αŸ‚αž› 15 αž“αžΆαž‘αžΈ αžŠαžΎαž˜αŸ’αž”αžΈαžŠαžΆαž€αŸ‹αžœαžΆαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαŸ‚αž˜αž½αž™ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αžΆαž“αžαžΆ...
(αž–αŸαžαŸ’αžšαž»αžŸβ€‹αžšαŸ†αžαžΆαž“β€‹αž€αŸ’αž˜αŸαž„β€‹αžαžΌαž…β€‹αžŠαŸ‚αž›β€‹αž˜αžΆαž“β€‹αž—αžΆαž–β€‹αž›αŸ’αž’αž·αžαž›αŸ’αž’αž“αŸ‹ αž“αž·αž„β€‹αž†αŸ’αž›αžΆαžβ€‹αž™αŸ‰αžΆαž„β€‹αžˆαŸ’αž›αžΎαž™αŸ” )
αž–αŸαžαŸ’αžšαž»αžŸαŸ– αžŸαžšαžŸαŸαžšβ€‹αž–αžΆαž€αŸ’αž™β€‹αž”αž‰αŸ’αž‡αžΆβ€‹αžŠαžΆαž…αŸ‹β€‹αžŠαŸ„αž™β€‹αž‘αŸ‚αž€ αžœαžΆβ€‹αž“αžΉαž„β€‹αž„αžΆαž™β€‹αžŸαŸ’αžšαž½αž›β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž’αžΆαž“αŸ”

Dockerfile αž›αžΌαžαž›αžΆαžŸαŸ‹αŸ–

FROM ubuntu:latest
RUN apt-get update
RUN apt-get upgrade
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full
RUN gem install bundler
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/*

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ Igor Ivanovich, DevOps (αž”αŸ‰αž»αž“αŸ’αžαŸ‚ Ops αž…αŸ’αžšαžΎαž“αž‡αžΆαž„ Dev) αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž·αž™αžΆαž›αŸαž™αžŠαŸ„αž™αžŸαŸ’αžšαŸ‚αž€αžαžΆ:

AI: Petya αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αžΆαž“αž”αŸ†αž”αŸ‚αž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αžΆαž αžΆαžšαž˜αŸ’αžαž„αž‘αŸ€αž αžαžΎαžœαžΆαž“αžΉαž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸ…αž–αŸαž›αžŽαžΆ...

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž”αŸ‰αŸ‡αž‘αž„αŸ’αž‚αž·αž…αž‚αŸ’αž“αžΆαžαžΌαž…αž˜αž½αž™ Igor Ivanovich αžαŸ’αžšαž‡αžΆαž€αŸ‹αž…αž»αŸ‡αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαŸ’αžœαŸ‚αž„αžšαž€αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αž·αžαŸ’αžαžšαž½αž˜αž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ”

αž’αžΆαž™ : αžαžΎαž’αŸ’αž“αž€αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈ?
VasilyαŸ– Peter αž€αŸ†αž–αž»αž„αž‡αž½αž™αžαŸ’αž‰αž»αŸ†αž”αž„αŸ’αž€αžΎαž Dockerfile αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΌαžŒαž»αž›αžαŸ’αž˜αžΈαž˜αž½αž™αŸ”
AIαŸ– αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž˜αžΎαž›... αžαžΎαž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž’αŸ’αžœαžΈαž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αžŸαž˜αŸ’αž’αžΆαžαžƒαŸ’αž›αžΆαŸ†αž„αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž”αž“αŸ’αžαŸ‚αž˜... αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΎαž’αŸ’αž“αž€αžŠαŸ†αž‘αžΎαž„αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžŠαŸ„αž™αžšαž”αŸ€αž”αžŽαžΆ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αž·αž“αž”αžΆαž“αž…αž˜αŸ’αž›αž„αž―αž€αžŸαžΆαžš Gemfile! αž αžΎαž™αž‡αžΆαž‘αžΌαž‘αŸ…αž“αŸαŸ‡αž˜αž·αž“αž›αŸ’αž’αž‘αŸαŸ”
αž–αŸαžαŸ’αžšαž»αžŸαŸ– αžŸαžΌαž˜β€‹αž‘αŸ…β€‹αž›αžΎβ€‹αž’αžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜β€‹αžšαž”αžŸαŸ‹β€‹αž’αŸ’αž“αž€ αž™αžΎαž„β€‹αž“αžΉαž„β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αžœαžΆβ€‹αžŠαŸ„αž™β€‹αžšαž”αŸ€αž”β€‹αžŽαžΆαŸ”

Igor Ivanovich αžŠαž€αžŠαž„αŸ’αž αžΎαž˜αž’αŸ†αžŠαŸ„αž™αž€αŸ’αžšαŸ€αž˜αž€αŸ’αžšαŸ† αž αžΎαž™αž…αžΆαž€αž…αŸαž‰αž‘αŸ…αžšαž€αž˜αžΎαž›αžαžΆαž’αŸ’αž“αž€αžŽαžΆαž‡αžΆαž’αŸ’αž“αž€αž”αŸ†αž”αŸ‚αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αž–αŸαžαŸ’αžšαž»αžŸαŸ– αž”αžΆαž‘ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‚αžΆαžαŸ‹αž“αž·αž™αžΆαž™αžαŸ’αžšαžΌαžœαž’αŸ†αž–αžΈαž€αžΌαžŠ αž™αžΎαž„αžαŸ’αžšαžΌαžœαžšαž»αž‰αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αŸ” αž αžΎαž™αžŸαžΌαž˜αžŠαŸ†αž‘αžΎαž„ ssh αž“αž·αž„ supervisor αž—αŸ’αž›αžΆαž˜αŸ— αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ αž™αžΎαž„αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸαž˜αž·αž“αŸ”

Vasily: αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžŠαŸ†αž”αžΌαž„αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž…αž˜αŸ’αž›αž„ Gemfile αž“αž·αž„ Gemfile.lock αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αžŠαŸ†αž‘αžΎαž„αž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž…αž˜αŸ’αž›αž„αž‚αž˜αŸ’αžšαŸ„αž„αž‘αžΆαŸ†αž„αž˜αžΌαž›αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎ Gemfile αž˜αž·αž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸ αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αž€αž…αŸαž‰αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αŸ”
αž–αŸαžαŸ’αžšαž»αžŸαŸ– αž αŸαžαž»β€‹αž’αŸ’αžœαžΈβ€‹αž”αžΆαž“β€‹αž‡αžΆβ€‹αž’αŸ’αž“αž€β€‹αž‘αžΆαŸ†αž„β€‹αž’αžŸαŸ‹β€‹αž‚αŸ’αž“αžΆβ€‹αž˜αžΆαž“β€‹αžŸαŸ’αžšαž‘αžΆαž”αŸ‹β€‹αž‘αžΆαŸ†αž„β€‹αž“αŸαŸ‡ αž…αž˜αŸ’αž›αž„β€‹αž’αŸ’αžœαžΈαŸ—β€‹αž‘αžΆαŸ†αž„β€‹αž’αžŸαŸ‹β€‹αž€αŸ’αž“αž»αž„β€‹αž–αŸαž›β€‹αžαŸ‚β€‹αž˜αž½αž™? αž…αž˜αŸ’αž›αž„αž—αŸ’αž›αžΆαž˜αŸ—αŸ” αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαŸ†αž”αžΌαž„αž”αŸ†αž•αž»αžαŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡ 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
RUN gem install bundler
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/* 

αž–αŸαžαŸ’αžšαž»αžŸαŸ– αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžαžΎβ€‹αž’αŸ’αžœαžΈβ€‹αž‘αŸ…β€‹αž‘αŸ€αž? αžαžΎαž’αŸ’αž“αž€αž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‘αŸ?
Vasily: αž‘αŸ αž‘αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž’αŸ’αžœαžΎαžœαžΆαž±αŸ’αž™αž›αžΏαž“αŸ”
αž–αŸαžαŸ’αžšαž»αžŸαŸ– αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αŸ’αž“αž€αž“αžΉαž„αž’αŸ’αžœαžΎαžœαžΆαŸ” αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡ αž…αžΌαžšβ€‹αž™αžΎαž„β€‹αž‚αžΌαžšβ€‹αž…αŸαž‰β€‹αž“αžΌαžœβ€‹αžŸαŸ’αž‚αŸ’αžšαžΈαž” init αžŠαŸ‚αž›β€‹αž“αžΉαž„β€‹αž”αžΎαž€β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αž‚αŸ’αžšαž”αŸ‹β€‹αž™αŸ‰αžΆαž„αŸ” αž˜αž·αž“αž’αžΈαž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ ssh αž‡αžΆαž˜αž½αž™ nohup αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž’αžΆαž…αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž€αž»αž„αžαžΊαž“αŸαžš αž αžΎαž™αž˜αžΎαž›αžαžΆαž˜αžΆαž“αž’αŸ’αžœαžΈαžαž»αžŸαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžαžΆαž˜αžšαž”αŸ€αž”αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αž’αž‰αŸ’αž…αžΉαž„αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžšαžαŸ‹αž’αŸ’αž“αž€αžŠαŸ†αžŽαžΎαžšαŸ”
αžŸαŸ†αžŽαž½αžšαŸ– αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αžΆαž“αžαžΆαž‚αž½αžšαžαŸ‚αž˜αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™ αžŠαžΌαž…αŸ’αž“αŸαŸ‡ Docker αž“αžΉαž„αžŠαžΉαž„αžαžΆαž˜αžΆαž“αž’αŸ’αžœαžΈαž˜αž½αž™αžαž»αžŸαž”αŸ’αžšαž€αŸ’αžšαžαžΈ αž αžΎαž™αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αž»αž„αžαžΊαž“αŸαžšαž‘αžΎαž„αžœαž·αž‰αž”αžΆαž“αŸ”
P: αž€αž»αŸ†αžšαŸ†αžαžΆαž“αž€αŸ’αž”αžΆαž›αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ„αž™αžŸαž˜αž αŸαžαž»αžŸαž˜αž•αž›αŸ” αž αžΎαž™αž‡αžΆαž‘αžΌαž‘αŸ…αž™αŸ‰αžΆαž„αž˜αŸ‰αŸαž…αžŠαŸ‚αžš? αžαžΎαž’αŸ’αž“αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αžŠαŸ„αž™αžšαž”αŸ€αž”αžŽαžΆαž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ‚αž˜αž½αž™? αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™ Igor Ivanovich αž‚αž·αžαž’αŸ†αž–αžΈαžŸαŸ’αžαŸαžšαž—αžΆαž–αžœαžΆαž˜αž·αž“αž˜αŸ‚αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αžΆαžαŸ‹αž‘αž‘αž½αž›αž”αžΆαž“αž”αŸ’αžšαžΆαž€αŸ‹αžαŸ‚αž“αŸ„αŸ‡αž‘αŸαŸ” αž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž‚αžΊαžŸαžšαžŸαŸαžšαž€αžΌαžŠαŸ” αž αžΎαž™αž‡αžΆαž‘αžΌαž‘αŸ…αžŸαžΌαž˜αž±αŸ’αž™αž‚αžΆαžαŸ‹αž“αž·αž™αžΆαž™αžαžΆαž’αžšαž‚αž»αžŽαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αžŸαžšαžŸαŸαžš Dockefile αž±αŸ’αž™αž‚αžΆαžαŸ‹αŸ”

10 αž“αžΆαž‘αžΈ αž“αž·αž„αžœαžΈαžŠαŸαž’αžΌαž–αžΈαžšαž’αŸ†αž–αžΈαž†αŸ’αž˜αžΆαž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ”

αžŸαŸ†αžŽαž½αžšαŸ– αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž’αŸ’αžœαžΎβ€‹αž‚αŸ’αžšαž”αŸ‹β€‹αž™αŸ‰αžΆαž„αŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αž”αž“αŸ’αžαŸ‚αž˜αŸ”
αž—αžΈαŸ– αž”αž„αŸ’αž αžΆαž‰αžαŸ’αž‰αž»αŸ†!

αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸƒ 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/* 

# ЗапускаСм скрипт, ΠΏΡ€ΠΈ стартС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запустит всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅.
CMD [β€œ/app/init.sh”]

P: αž›αŸ’αž’αžŽαžΆαžŸαŸ‹ αžαŸ’αž‰αž»αŸ†αž…αžΌαž›αž…αž·αžαŸ’αžαžœαžΆαŸ” αž αžΎαž™αž˜αžαž·αž‡αžΆαž—αžΆαžŸαžΆαžšαž»αžŸαŸ’αžŸαžΈ αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž’αžΆαž…αž’αžΆαž“αž”αžΆαž“ αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αž“αžΆαž“αžΉαž„αž’αŸ’αžœαžΎαž€αžΆαžšαžŠαžΌαž…αž“αŸ„αŸ‡αŸ” αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž”αž„αŸ’αžšαŸ€αž“β€‹αž’αŸ’αž“αž€β€‹αž‚αŸ’αžšαž”αŸ‹β€‹αž™αŸ‰αžΆαž„ αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž’αŸ’αžœαžΎβ€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž“αŸ…β€‹αžŸαž›αŸ‹β€‹αžŠαŸ„αž™β€‹αžαŸ’αž›αž½αž“β€‹αž―αž„αŸ” αžαŸ„αŸ‡αž‘αŸ…αž‰αžΆαŸ†αž€αžΆαž αŸ’αžœαŸ...

αž˜αŸ‚αž“αž αžΎαž™αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž˜αžΆαž“ Dockerfile αžŠαŸαž‚αž½αžšαž±αŸ’αž™αž—αŸαž™αžαŸ’αž›αžΆαž…αžŠαŸ‚αž›αž˜αžΎαž›αžƒαžΎαž‰αžŠαŸ‚αž›αž“αžΉαž„αž’αŸ’αžœαžΎαž±αŸ’αž™ Igor Ivanovich αž…αž„αŸ‹αž›αžΆαžˆαž”αŸ‹αž αžΎαž™αž—αŸ’αž“αŸ‚αž€αžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αž“αžΉαž„αžˆαžΊαž…αžΆαž”αŸ‹αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž˜αž½αž™αžŸαž”αŸ’αžαžΆαž αŸαž‘αŸ€αžαŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ Dockerfile αž’αžΆαž…αž€αžΆαž“αŸ‹αžαŸ‚αž’αžΆαž€αŸ’αžšαž€αŸ‹αž‘αŸ…αŸ— αžœαžΆαž‚αŸ’αž˜αžΆαž“αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž…αŸ†αž–αŸ„αŸ‡αž—αžΆαž–αž›αŸ’αž’αž₯αžαžαŸ’αž…αŸ„αŸ‡αž“αŸ„αŸ‡αž‘αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αžœαžΆαž“αžΉαž„αž’αŸ’αžœαžΎαŸ”

αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž€αžΆαžšαžŠαž€αžŸαŸ’αžšαž„αŸ‹αž–αžΈ Grigory OsterαŸ–

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αž·αž“αž‘αžΆαž“αŸ‹αž”αŸ’αžšαžΆαž€αžŠ
αž™αžΎαž„αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž•αŸ’αž›αžΌαžœαž€αŸ’αž“αž»αž„αž‡αžΈαžœαž·αž
αž αžΎαž™αž’αŸ’αž“αž€αž˜αž·αž“αžŠαžΉαž„αžαžΆαž αŸαžαž»αž’αŸ’αžœαžΈαž‘αŸαŸ”
αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€,
αž”αŸ†αž”αŸ‚αž€αž’αŸ†αž–αžΌαž›αž“αŸ…αžαžΆαž˜αžŸαžΆαž›αž’αŸ† -
αž˜αž“αž»αžŸαŸ’αžŸαž“αžΉαž„αž“αž·αž™αžΆαž™αžαžΆ "αž’αžšαž‚αž»αžŽ" αž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸ’αž“αž€αŸ”
αž’αŸ’αž“αž€αž“αžΉαž„αž‡αž½αž™αž”αŸ’αžšαž‡αžΆαž‡αž“
αžŸαž“αŸ’αžŸαŸ†αžŸαŸ†αž…αŸƒαž’αž‚αŸ’αž‚αž·αžŸαž“αžΈαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹