Docker: lời khuyên tồi

Docker: lời khuyên tồi

Khi tôi đang học lái xe ô tô, ngay buổi học đầu tiên, người hướng dẫn đã lái xe ngược chiều vào ngã tư và sau đó nói rằng bạn không nên làm như vậy - không bao giờ. Tôi ghi nhớ quy tắc này ngay lập tức và suốt đời.

Bạn đọc “Lời khuyên tồi” của Grigory Oster cho trẻ em, và bạn thấy chúng nhận ra rằng chúng không nên làm điều này một cách dễ dàng và tự nhiên như thế nào.

Rất nhiều bài viết đã viết về cách viết Dockerfile một cách chính xác. Nhưng tôi không thấy hướng dẫn về cách viết Dockerfiles không chính xác. Tôi đang lấp đầy khoảng trống này. Và có thể trong những dự án mà tôi nhận hỗ trợ sẽ có ít dockerfile như vậy hơn.

Tất cả các nhân vật, tình huống và Dockerfile đều là hư cấu. Nếu bạn nhận ra chính mình, xin lỗi.

Tạo Dockerfile, đáng ngại và khủng khiếp

Peter (Nhà phát triển java/rubby/php cấp cao): Đồng nghiệp Vasily, bạn đã tải mô-đun mới lên Docker chưa?
Vasily (đàn em): Không, tôi không có thời gian, tôi không thể tìm ra điều đó với Docker này. Có rất nhiều bài viết về nó, thật chóng mặt.

Peter: Chúng tôi đã có thời hạn một năm trước. Hãy để tôi giúp bạn, chúng ta sẽ tìm ra cách trong quá trình này. Hãy cho tôi biết điều gì không hiệu quả với bạn.

Vasily: Tôi không thể chọn một hình ảnh cơ bản sao cho tối giản nhưng có đủ mọi thứ bạn cần.
Peter: Lấy hình ảnh Ubuntu, nó có mọi thứ bạn cần. Và rất nhiều thứ không cần thiết sẽ có ích sau này. Và đừng quên gắn tag mới nhất để phiên bản luôn là mới nhất.

Và dòng đầu tiên xuất hiện trong Dockerfile:

FROM ubuntu:latest

Peter: Tiếp theo là gì, chúng ta đã sử dụng cái gì để viết mô-đun của mình?
Vasily: Ruby, có một máy chủ web và một vài trình nền dịch vụ sẽ được khởi chạy.
Peter: Vâng, chúng ta cần gì: Ruby, Bundler, nodejs, imagemagick và những thứ khác... Đồng thời, hãy nâng cấp để chắc chắn nhận được các gói mới.
Vasily: Và chúng tôi sẽ không tạo người dùng để không bị root?
Peter: Mẹ kiếp, thế thì bạn vẫn phải lảng vảng với quyền lợi.
Vasily: Tôi cần thời gian, khoảng 15 phút, để tổng hợp tất cả lại thành một mệnh lệnh, tôi đọc được rằng...
(Peter thô lỗ ngắt lời cậu học trò tỉ mỉ và rất thông minh.)
Peter: Viết thành các lệnh riêng biệt sẽ dễ đọc hơn.

Dockerfile phát triển:

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/*

Sau đó Igor Ivanovich, DevOps (nhưng nhiều Ops hơn Dev), xông vào văn phòng và hét lên:

AI: Petya, các nhà phát triển của bạn lại phá vỡ cơ sở dữ liệu thực phẩm, khi nào chuyện này mới kết thúc...

Sau một cuộc giao tranh nhỏ, Igor Ivanovich bình tĩnh lại và bắt đầu tìm hiểu xem các đồng nghiệp của mình đang làm gì ở đây.

AI: Bạn đang làm gì vậy?
Vasily: Peter đang giúp tôi tạo Dockerfile cho mô-đun mới.
AI: Để tôi xem thử... Bạn viết gì ở đây, bạn dọn dẹp kho lưu trữ bằng lệnh riêng, đây là lớp bổ sung... Nhưng bạn chưa sao chép Gemfile thì cài đặt phụ thuộc như thế nào! Và nói chung, điều này là không tốt.
Peter: Hãy tiếp tục công việc của bạn, chúng tôi sẽ tìm ra cách nào đó.

Igor Ivanovich thở dài buồn bã và rời đi để tìm xem ai đã phá vỡ cơ sở dữ liệu.

Peter: Đúng, nhưng anh ấy đã đúng về đoạn mã, chúng ta cần đưa nó vào hình ảnh. Và hãy cài đặt ngay ssh và giám sát, nếu không chúng ta sẽ khởi động daemon.

Vasily: Sau đó, trước tiên tôi sẽ sao chép Gemfile và Gemfile.lock, sau đó tôi sẽ cài đặt mọi thứ và sau đó tôi sẽ sao chép toàn bộ dự án. Nếu Gemfile không thay đổi, lớp sẽ bị xóa khỏi bộ đệm.
Peter: Tại sao bạn lại có những lớp này, sao chép mọi thứ cùng một lúc. Sao chép ngay lập tức. Ngay dòng đầu tiên.

Dockerfile bây giờ trông như thế này:

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/* 

Peter: Vậy tiếp theo là gì? Bạn có cấu hình cho người giám sát không?
Vasily: Không, không. Nhưng tôi sẽ làm điều đó nhanh chóng.
Peter: Vậy thì bạn sẽ làm được. Bây giờ chúng ta hãy phác thảo một tập lệnh init để khởi chạy mọi thứ. Được rồi, vậy bạn bắt đầu ssh, với nohup, để chúng ta có thể kết nối với vùng chứa và xem điều gì đã xảy ra. Sau đó chạy giám sát theo cách tương tự. Thôi thì bạn cứ chạy hành khách đi.
Hỏi: Nhưng tôi đọc được rằng cần có một quy trình để Docker biết rằng đã xảy ra sự cố và có thể khởi động lại vùng chứa.
P: Đừng bận tâm với những điều vô nghĩa. Và nói chung, làm thế nào? Làm thế nào để bạn chạy tất cả điều này trong một quá trình? Hãy để Igor Ivanovich nghĩ về sự ổn định, việc anh ấy nhận được lương không phải là vô ích. Công việc của chúng tôi là viết mã. Và nói chung, hãy để anh ấy nói lời cảm ơn vì chúng tôi đã viết Dockefile cho anh ấy.

10 phút và hai video về mèo sau.

Hỏi: Tôi đã làm xong mọi việc. Tôi đã thêm nhiều ý kiến ​​hơn.
P: Hãy cho tôi xem!

Phiên bản mới nhất của 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: Tuyệt, tôi thích nó. Và các bình luận bằng tiếng Nga, tiện lợi và dễ đọc, mọi người đều làm như vậy. Tôi đã dạy bạn mọi thứ, phần còn lại bạn có thể tự làm. Chúng ta đi uống cà phê nhé...

Chà, bây giờ chúng ta có một Dockerfile hoàn toàn khủng khiếp, cảnh tượng của nó sẽ khiến Igor Ivanovich muốn bỏ việc và mắt anh ấy sẽ đau thêm một tuần nữa. Tất nhiên, Dockerfile có thể còn tệ hơn nữa, không có giới hạn nào cho sự hoàn hảo. Nhưng để bắt đầu, điều này sẽ làm được.

Tôi muốn kết thúc bằng một câu trích dẫn của Grigory Oster:

Nếu bạn chưa chắc chắn
Chúng ta đã chọn con đường trong cuộc sống,
Và bạn không biết tại sao
Bắt đầu hành trình lao động của bạn,
Đập vỡ bóng đèn ở hành lang -
Mọi người sẽ nói "Cảm ơn" với bạn.
Bạn sẽ giúp đỡ mọi người
Tiết kiệm điện.

Nguồn: www.habr.com

Thêm một lời nhận xét