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!"]
7Vậ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
import flask
print["It worked!"]
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àoChú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 Condaname: 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"]
2import 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ư sauFROM 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!"]
0Tạ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
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"]
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àmimport 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!"]
7import flask
print["It worked!"]
5Điều này sẽ làm việc?
import flask
print["It worked!"]
6Vấ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àmimport 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ạtMộ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ạiimport flask
print["It worked!"]
6Và bây giờ hình ảnh được xây dựng
import flask
print["It worked!"]
7Chú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!"]
0Vấ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àyimport flask
print["It worked!"]
1Vấ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
import flask
print["It worked!"]
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!"]
7import flask
print["It worked!"]
2Và thực sự
import flask
print["It worked!"]
3Mộ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ạtCó 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!"]
4Và
import flask
print["It worked!"]
7import flask
print["It worked!"]
5Và chúng ta có thể thử
import flask
print["It worked!"]
3Bà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