Ví dụ python dockerfile

Công cụ đóng gói Conda triển khai các môi trường cho phép các ứng dụng khác nhau cài đặt các thư viện khác nhau. Vì vậy, khi bạn đang xây dựng hình ảnh Docker cho ứng dụng dựa trên Conda, bạn sẽ cần kích hoạt môi trường Conda

Thật không may, việc kích hoạt môi trường Conda hơi phức tạp và tương tác không tốt với cách thức hoạt động của

import flask

print["It worked!"]
7

Vậy làm cách nào để bạn kích hoạt môi trường Conda trong

import flask

print["It worked!"]
7?

Vì mục đích giáo dục, tôi sẽ bắt đầu bằng việc giải thích vấn đề và chỉ ra một số giải pháp không hiệu quả, nhưng nếu muốn, bạn có thể chuyển thẳng sang giải pháp hiệu quả

Vấn đề với
import flask

print["It worked!"]
9

Môi trường Conda cung cấp một hình thức cách ly. mỗi môi trường có bộ thư viện C, thư viện Python, nhị phân, v.v. Conda cài đặt một môi trường cơ sở nơi chính nó được cài đặt, vì vậy, để sử dụng ứng dụng dựa trên Conda, bạn cần tạo rồi kích hoạt một môi trường mới, dành riêng cho ứng dụng

Cụ thể, để kích hoạt môi trường Conda, bạn thường chạy

import flask

print["It worked!"]
9. Vì vậy, hãy thử điều đó như lần thử đầu tiên của chúng tôi và xem nó thất bại như thế nào

Chúng ta sẽ bắt đầu với một tệp

FROM continuumio/miniconda3

WORKDIR /app

# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml

# Activate the environment, and make sure it's activated:
RUN conda activate myenv
RUN echo "Make sure flask is installed:"
RUN python -c "import flask"

# The code to run when container is started:
COPY run.py .
ENTRYPOINT ["python", "run.py"]
1 xác định môi trường Conda

name: myenv
channels:
  - conda-forge
dependencies:
  - python=3.8
  - flask

Và một chương trình Python nhỏ,

FROM continuumio/miniconda3

WORKDIR /app

# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml

# Activate the environment, and make sure it's activated:
RUN conda activate myenv
RUN echo "Make sure flask is installed:"
RUN python -c "import flask"

# The code to run when container is started:
COPY run.py .
ENTRYPOINT ["python", "run.py"]
2

import flask

print["It worked!"]

Nỗ lực đầu tiên tại một

import flask

print["It worked!"]
7 có thể trông như sau

FROM continuumio/miniconda3

WORKDIR /app

# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml

# Activate the environment, and make sure it's activated:
RUN conda activate myenv
RUN echo "Make sure flask is installed:"
RUN python -c "import flask"

# The code to run when container is started:
COPY run.py .
ENTRYPOINT ["python", "run.py"]

Ghi chú. Bên ngoài bất kỳ phương pháp hay nhất cụ thể nào đang được trình bày, Dockerfiles trong bài viết này không phải là ví dụ về các phương pháp hay nhất, vì sự phức tạp được thêm vào sẽ che khuất điểm chính của bài viết

Bạn cần vận chuyển nhanh chóng và không có thời gian để tự mình tìm hiểu từng chi tiết?

Nếu chúng tôi xây dựng hình ảnh Docker kết quả, đây là điều sẽ xảy ra

import flask

print["It worked!"]
0

Tại sao mô phỏng kích hoạt không hoạt động

Bạn có thể tránh sử dụng

import flask

print["It worked!"]
9 và chỉ đặt một vài biến môi trường không?

Không giống như tập lệnh

FROM continuumio/miniconda3

WORKDIR /app

# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml

# Activate the environment, and make sure it's activated:
RUN conda activate myenv
RUN echo "Make sure flask is installed:"
RUN python -c "import flask"

# The code to run when container is started:
COPY run.py .
ENTRYPOINT ["python", "run.py"]
5 cho công cụ Python
FROM continuumio/miniconda3

WORKDIR /app

# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml

# Activate the environment, and make sure it's activated:
RUN conda activate myenv
RUN echo "Make sure flask is installed:"
RUN python -c "import flask"

# The code to run when container is started:
COPY run.py .
ENTRYPOINT ["python", "run.py"]
6, chỉ đặt một hoặc hai biến môi trường, kích hoạt Conda cũng có thể kích hoạt các biến môi trường do gói đặt

Điều đó có nghĩa là bạn không thể mô phỏng nó, bạn cần sử dụng cơ sở hạ tầng kích hoạt của chính Conda. Vậy chúng ta sẽ làm điều đó như thế nào?

Một giải pháp thất bại, phần #1.
FROM continuumio/miniconda3

WORKDIR /app

# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml

# Activate the environment, and make sure it's activated:
RUN conda activate myenv
RUN echo "Make sure flask is installed:"
RUN python -c "import flask"

# The code to run when container is started:
COPY run.py .
ENTRYPOINT ["python", "run.py"]
7

Chúng ta có thể khiến

import flask

print["It worked!"]
9 hoạt động bằng cách thực hiện
FROM continuumio/miniconda3

WORKDIR /app

# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml

# Activate the environment, and make sure it's activated:
RUN conda activate myenv
RUN echo "Make sure flask is installed:"
RUN python -c "import flask"

# The code to run when container is started:
COPY run.py .
ENTRYPOINT ["python", "run.py"]
7 được yêu cầu không?

import flask

print["It worked!"]
00 sẽ cài đặt một số lệnh khởi động cho
import flask

print["It worked!"]
01 để cho phép
import flask

print["It worked!"]
9 hoạt động, nhưng mã thiết lập đó chỉ chạy nếu bạn có trình bao bash đăng nhập. khi bạn làm

import flask

print["It worked!"]
0

Điều đang thực sự xảy ra là Docker đang làm

import flask

print["It worked!"]
03. Tuy nhiên, bạn có thể ghi đè trình bao mặc định bằng lệnh
import flask

print["It worked!"]
04

Điều đó cộng với

import flask

print["It worked!"]
00 mang lại cho chúng tôi những điều sau đây
import flask

print["It worked!"]
7

import flask

print["It worked!"]
5

Điều này sẽ làm việc?

import flask

print["It worked!"]
6

Vấn đề là mỗi

import flask

print["It worked!"]
07 trong một
import flask

print["It worked!"]
7 là một lần chạy riêng biệt của
import flask

print["It worked!"]
01. Vì vậy, khi bạn làm

import flask

print["It worked!"]
0

Điều đó chỉ kích hoạt nó cho

import flask

print["It worked!"]
07 đầu tiên và các
import flask

print["It worked!"]
07 sau đó là các phiên shell mới mà không xảy ra kích hoạt

Một giải pháp thất bại, phần #2. Kích hoạt tự động

Chúng tôi muốn mọi lệnh

import flask

print["It worked!"]
07 được kích hoạt, vì vậy chúng tôi thêm
import flask

print["It worked!"]
9 vào
import flask

print["It worked!"]
04 của người dùng hiện tại

import flask

print["It worked!"]
6

Và bây giờ hình ảnh được xây dựng

import flask

print["It worked!"]
7

Chúng tôi chưa hoàn thành, mặc dù. Nếu chúng ta chạy hình ảnh

import flask

print["It worked!"]
0

Vấn đề là cú pháp chúng tôi sử dụng cho

import flask

print["It worked!"]
05 không thực sự bắt đầu một phiên trình bao. Bây giờ, thay vì thực hiện
import flask

print["It worked!"]
06, bạn thực sự có thể yêu cầu
import flask

print["It worked!"]
05 sử dụng trình bao với cú pháp thay thế này

import flask

print["It worked!"]
1

Vấn đề với cú pháp này là nó làm hỏng quá trình tắt container, vì vậy bạn có thể không muốn sử dụng nó

Một giải pháp làm việc với
import flask

print["It worked!"]
08

Thay vì sử dụng

import flask

print["It worked!"]
9, có một cách khác để chạy lệnh bên trong môi trường.
import flask

print["It worked!"]
50 sẽ chạy
import flask

print["It worked!"]
51 bên trong môi trường. Bạn cũng sẽ muốn chuyển cờ
import flask

print["It worked!"]
52 cho
import flask

print["It worked!"]
08 để nó phát trực tiếp thiết bị xuất chuẩn và thiết bị xuất chuẩn [cảm ơn Joe Selvik đã chỉ ra điều này]. Vì vậy, điều đó gợi ý những điều sau đây
import flask

print["It worked!"]
7

import flask

print["It worked!"]
2

Và thực sự

import flask

print["It worked!"]
3

Một giải pháp làm việc khác

Một nhược điểm của giải pháp trước đó là

import flask

print["It worked!"]
08 được mô tả như một lệnh “thử nghiệm”, do đó, về mặt lý thuyết, nó có thể gây ra sự cố

Một cách tiếp cận khác là tận dụng thực tế là hình ảnh

import flask

print["It worked!"]
56 mà chúng ta đang sử dụng có cấu hình
import flask

print["It worked!"]
01 để sử dụng Conda. Do đó, chúng tôi có thể thiết lập cấu hình bash để kích hoạt môi trường của mình và đối với điểm vào, chúng tôi có thể chạy tập lệnh shell thực hiện kích hoạt

Có một điểm khó khăn ở đây. thông thường, tôi khuyên bạn nên sử dụng các tập lệnh Shell ngay từ đầu để kích hoạt cái gọi là “chế độ nghiêm ngặt bash”. Về cơ bản, điều này có nghĩa là nếu bạn sử dụng một biến không xác định hoặc một chương trình bị lỗi, tập lệnh sẽ dừng lại, đó là điều bạn muốn. Tuy nhiên, một số tập lệnh kích hoạt Conda bị hỏng khi chế độ này được bật. Vì vậy, những gì chúng ta phải làm là vô hiệu hóa nghiêm ngặt trong khi kích hoạt tập lệnh

Đây là điểm vào

import flask

print["It worked!"]
4

import flask

print["It worked!"]
7

import flask

print["It worked!"]
5

Và chúng ta có thể thử

import flask

print["It worked!"]
3

Bài viết tiếp theo. Thu nhỏ hình ảnh Conda Docker của bạn bằng conda-pack
Bài viết trước. Pip so với Conda. so sánh chuyên sâu về hai hệ thống đóng gói của Python

Tạo hình ảnh Docker Conda sẵn sàng sản xuất chỉ trong một giờ

Bạn đang đóng gói ứng dụng Python dựa trên Conda của mình bằng Docker và điều đó có nghĩa là một loạt lo lắng mới

Bạn có hình ảnh khổng lồ 2GB, việc xây dựng lại hình ảnh có nghĩa là bạn phải chờ hàng giờ để Conda giải quyết các vấn đề phụ thuộc và bạn lo lắng về tính bảo mật của hình ảnh của mình

Tìm hiểu cách nhanh nhất, dễ dàng nhất để chuyển từ hình ảnh Docker nguyên mẫu mà bạn đang chạy trên máy tính xách tay của mình sang hình ảnh Docker sẵn sàng sản xuất nhỏ, xây dựng nhanh và bảo mật

sách điện tử miễn phí. "Giới thiệu về Dockerizing cho sản xuất"

Tìm hiểu quy trình đóng gói DevOps lặp đi lặp lại từng bước trong sách điện tử nhỏ miễn phí này. Bạn sẽ tìm hiểu những gì cần ưu tiên, các quyết định bạn cần đưa ra và các quy trình tổ chức đang diễn ra mà bạn cần bắt đầu

Ngoài ra, bạn sẽ tham gia cùng hơn 6500 người nhận email hàng tuần về các công cụ và kỹ thuật thực tế, từ cách đóng gói Docker đến các phương pháp hay nhất về Python

Chủ Đề