จะหลีกเลี่ยงการติดตั้งแพ็คเกจใหม่เมื่อสร้างอิมเมจ Docker สำหรับโครงการ Python ได้อย่างไร


128

Dockerfile ของฉันเป็นเช่น

FROM my/base

ADD . /srv
RUN pip install -r requirements.txt
RUN python setup.py install

ENTRYPOINT ["run_server"]

ทุกครั้งที่สร้างอิมเมจใหม่ต้องติดตั้งการอ้างอิงใหม่ซึ่งอาจช้ามากในภูมิภาคของฉัน

วิธีหนึ่งที่ฉันนึกถึงcacheแพ็คเกจที่ติดตั้งคือการแทนที่my/baseรูปภาพด้วยรูปภาพที่ใหม่กว่าเช่นนี้:

docker build -t new_image_1 .
docker tag new_image_1 my/base

ในครั้งต่อไปที่ฉันสร้างด้วย Dockerfile นี้ / ฐานของฉันได้ติดตั้งแพ็คเกจบางอย่างแล้ว

แต่วิธีนี้มีปัญหาสองประการ:

  1. ไม่สามารถลบล้างรูปภาพพื้นฐานได้เสมอไป
  2. ภาพฐานจะใหญ่ขึ้นเรื่อย ๆ เมื่อภาพใหม่ ๆ ถูกจัดวางเป็นเลเยอร์

ฉันจะใช้ทางออกใดที่ดีกว่าในการแก้ปัญหานี้ได้

แก้ไข ##:

ข้อมูลบางอย่างเกี่ยวกับนักเทียบท่าในเครื่องของฉัน:

  test  docker version
Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.1
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070
  test  docker info
Containers: 0
Images: 56
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Dirs: 56
Execution Driver: native-0.2
Kernel Version: 3.13.0-29-generic
WARNING: No swap limit support

คุณลบภาพกลางหลังจากสร้างภาพเสร็จหรือไม่?
Regan

ไม่แน่นอน แต่มันไม่เกี่ยวข้องเพราะเมื่อฉันสร้างภาพใหม่ฉันยังคงยึดตามต้นฉบับmy/base
satoru

คำตอบ:


139

ลองสร้าง Dockerfile ซึ่งมีลักษณะดังนี้:

FROM my/base

WORKDIR /srv
ADD ./requirements.txt /srv/requirements.txt
RUN pip install -r requirements.txt
ADD . /srv
RUN python setup.py install

ENTRYPOINT ["run_server"]

นักเทียบท่าจะใช้แคชระหว่างการติดตั้ง pip ตราบเท่าที่คุณไม่ได้ทำการเปลี่ยนแปลงใด ๆ กับไฟล์requirements.txtโดยไม่คำนึงถึงความจริงว่าไฟล์โค้ดอื่น ๆ.มีการเปลี่ยนแปลงหรือไม่ นี่คือตัวอย่าง


นี่คือHello, World!โปรแกรมง่ายๆ:

$ tree
.
├── Dockerfile
├── requirements.txt
└── run.py   

0 directories, 3 file

# Dockerfile

FROM dockerfile/python
WORKDIR /srv
ADD ./requirements.txt /srv/requirements.txt
RUN pip install -r requirements.txt
ADD . /srv
CMD python /srv/run.py

# requirements.txt
pytest==2.3.4

# run.py
print("Hello, World")

ผลลัพธ์ของการสร้างนักเทียบท่า:

Step 1 : WORKDIR /srv
---> Running in 22d725d22e10
---> 55768a00fd94
Removing intermediate container 22d725d22e10
Step 2 : ADD ./requirements.txt /srv/requirements.txt
---> 968a7c3a4483
Removing intermediate container 5f4e01f290fd
Step 3 : RUN pip install -r requirements.txt
---> Running in 08188205e92b
Downloading/unpacking pytest==2.3.4 (from -r requirements.txt (line 1))
  Running setup.py (path:/tmp/pip_build_root/pytest/setup.py) egg_info for package pytest
....
Cleaning up...
---> bf5c154b87c9
Removing intermediate container 08188205e92b
Step 4 : ADD . /srv
---> 3002a3a67e72
Removing intermediate container 83defd1851d0
Step 5 : CMD python /srv/run.py
---> Running in 11e69b887341
---> 5c0e7e3726d6
Removing intermediate container 11e69b887341
Successfully built 5c0e7e3726d6

มาแก้ไขrun.py:

# run.py
print("Hello, Python")

ลองสร้างอีกครั้งด้านล่างคือผลลัพธ์:

Sending build context to Docker daemon  5.12 kB
Sending build context to Docker daemon 
Step 0 : FROM dockerfile/python
---> f86d6993fc7b
Step 1 : WORKDIR /srv
---> Using cache
---> 55768a00fd94
Step 2 : ADD ./requirements.txt /srv/requirements.txt
---> Using cache
---> 968a7c3a4483
Step 3 : RUN pip install -r requirements.txt
---> Using cache
---> bf5c154b87c9
Step 4 : ADD . /srv
---> 9cc7508034d6
Removing intermediate container 0d7cf71eb05e
Step 5 : CMD python /srv/run.py
---> Running in f25c21135010
---> 4ffab7bc66c7
Removing intermediate container f25c21135010
Successfully built 4ffab7bc66c7

ดังที่คุณเห็นด้านบนคราวนี้นักเทียบท่าใช้แคชระหว่างการสร้าง ตอนนี้มาอัปเดตrequirements.txt:

# requirements.txt

pytest==2.3.4
ipython

ด้านล่างนี้คือผลลัพธ์ของการสร้างนักเทียบท่า:

Sending build context to Docker daemon  5.12 kB
Sending build context to Docker daemon 
Step 0 : FROM dockerfile/python
---> f86d6993fc7b
Step 1 : WORKDIR /srv
---> Using cache
---> 55768a00fd94
Step 2 : ADD ./requirements.txt /srv/requirements.txt
---> b6c19f0643b5
Removing intermediate container a4d9cb37dff0
Step 3 : RUN pip install -r requirements.txt
---> Running in 4b7a85a64c33
Downloading/unpacking pytest==2.3.4 (from -r requirements.txt (line 1))
  Running setup.py (path:/tmp/pip_build_root/pytest/setup.py) egg_info for package pytest

Downloading/unpacking ipython (from -r requirements.txt (line 2))
Downloading/unpacking py>=1.4.12 (from pytest==2.3.4->-r requirements.txt (line 1))
  Running setup.py (path:/tmp/pip_build_root/py/setup.py) egg_info for package py

Installing collected packages: pytest, ipython, py
  Running setup.py install for pytest

Installing py.test script to /usr/local/bin
Installing py.test-2.7 script to /usr/local/bin
  Running setup.py install for py

Successfully installed pytest ipython py
Cleaning up...
---> 23a1af3df8ed
Removing intermediate container 4b7a85a64c33
Step 4 : ADD . /srv
---> d8ae270eca35
Removing intermediate container 7f003ebc3179
Step 5 : CMD python /srv/run.py
---> Running in 510359cf9e12
---> e42fc9121a77
Removing intermediate container 510359cf9e12
Successfully built e42fc9121a77

สังเกตว่านักเทียบท่าไม่ได้ใช้แคชระหว่างการติดตั้ง pip หากไม่ได้ผลให้ตรวจสอบเวอร์ชันนักเทียบท่าของคุณ

Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.1
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070

2
ดูเหมือนจะไม่ได้ผลเพราะเมื่อใดก็ตามที่นักเทียบท่าเห็นADDคำสั่งแคชจะไม่ถูกต้อง
satoru

1
ฉันไม่แน่ใจว่าทำไมมันถึงใช้ไม่ได้ แต่ไม่มีการเปลี่ยนแปลงใด ๆ ใน requirements.txt (เปิด <src> ADD ./requirements.txt /srv/requirements.txt) จากนั้นนักเทียบท่าต้องใช้แคช ดูเพิ่ม secitonบนเอกสาร Dockerfile
nacyot

16
ใช่มันจะใช้แคชถ้าความต้องการ txt ไม่เปลี่ยนแปลง แต่ถ้าความต้องการ. txt เปลี่ยนแปลงข้อกำหนดทั้งหมดจะถูกดาวน์โหลด มีวิธีใดบ้างที่ฉันสามารถติดตั้ง pip cache volume ลงใน Docker container เพื่อโหลดจากแคชได้
Jitu

7
กุญแจสำคัญสำหรับคำตอบนี้คือคุณต้องเพิ่มข้อกำหนด. txt ( ADD requirements.txt /srvก่อนที่คุณจะเรียกใช้ pip ( RUN pip install -r requirements.txt) และเพิ่มไฟล์อื่น ๆ ทั้งหมดหลังจากรัน pip ดังนั้นไฟล์เหล่านี้ควรอยู่ในลำดับต่อไปนี้: (1) ADD requirements.txt /srv; (2) RUN pip install -r requirements.txt; ( 3)ADD . /srv
engelen

2
โปรดทราบว่าวิธีนี้ใช้ไม่ได้เมื่อใช้ COPY แทน ADD
veuncent

29

ในการลดกิจกรรมเครือข่ายคุณสามารถชี้pipไปที่ไดเรกทอรีแคชบนเครื่องโฮสต์ของคุณ

เรียกใช้คอนเทนเนอร์นักเทียบท่าของคุณด้วยการผูกไดเร็กทอรี pip cache ของโฮสต์ที่ติดตั้งในไดเรกทอรี pip cache ของคอนเทนเนอร์ของคุณ docker runคำสั่งควรมีลักษณะดังนี้:

docker run -v $HOME/.cache/pip-docker/:/root/.cache/pip image_1

จากนั้นใน Dockerfile ของคุณให้ติดตั้งข้อกำหนดของคุณเป็นส่วนหนึ่งของENTRYPOINTคำสั่ง (หรือCMDคำสั่ง) แทนที่จะเป็นRUNคำสั่ง นี่เป็นสิ่งสำคัญเนื่องจาก (ตามที่ระบุไว้ในความคิดเห็น) เมาท์ไม่พร้อมใช้งานในระหว่างการสร้างภาพ (เมื่อRUNมีการเรียกใช้คำสั่ง) ไฟล์ Docker ควรมีลักษณะดังนี้:

FROM my/base

ADD . /srv

ENTRYPOINT ["sh", "-c", "pip install -r requirements.txt && python setup.py install && run_server"]

4
ไม่ใช่สิ่งที่ OP กำลังมองหาในกรณีการใช้งานของเขา แต่ถ้าคุณสร้างเซิร์ฟเวอร์สร้างนี่เป็นความคิดที่ดี
oden

2
ดูเหมือนว่าจะเป็นสูตรสำหรับปัญหาโดยเฉพาะคำแนะนำให้ชี้ไปที่แคชของโฮสต์เริ่มต้น คุณอาจผสมแพ็กเกจเฉพาะอาร์ค
Giacomo Lacava

@GiacomoLacava ขอบคุณนั่นเป็นจุดที่ดีมาก ฉันปรับคำตอบและลบส่วนที่แนะนำให้ใช้ไดเรกทอรีแคชของโฮสต์ซ้ำ
Jakub Kukul

24

ฉันเข้าใจว่าคำถามนี้มีคำตอบยอดนิยมอยู่แล้ว แต่มีวิธีใหม่กว่าในการแคชไฟล์สำหรับผู้จัดการแพ็คเกจ ฉันคิดว่ามันน่าจะเป็นคำตอบที่ดีในอนาคตเมื่อ BuildKit มีมาตรฐานมากขึ้น

ในฐานะของนักเทียบท่า 18.09 มีการสนับสนุนการทดลองสำหรับBuildKit BuildKit เพิ่มการรองรับคุณสมบัติใหม่บางอย่างใน Dockerfile รวมถึงการสนับสนุนทดลองสำหรับการติดตั้งไดรฟ์ข้อมูลภายนอกเป็นRUNขั้นตอน สิ่งนี้ช่วยให้เราสร้างแคชสำหรับสิ่งต่างๆเช่น$HOME/.cache/pip/.

เราจะใช้requirements.txtไฟล์ต่อไปนี้เป็นตัวอย่าง:

Click==7.0
Django==2.2.3
django-appconf==1.0.3
django-compressor==2.3
django-debug-toolbar==2.0
django-filter==2.2.0
django-reversion==3.0.4
django-rq==2.1.0
pytz==2019.1
rcssmin==1.0.6
redis==3.3.4
rjsmin==1.1.0
rq==1.1.0
six==1.12.0
sqlparse==0.3.0

ตัวอย่างทั่วไปของ Python Dockerfileอาจมีลักษณะดังนี้:

FROM python:3.7
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app/
RUN pip install -r requirements.txt
COPY . /usr/src/app

เมื่อเปิดใช้งาน BuildKit โดยใช้DOCKER_BUILDKITตัวแปรสภาพแวดล้อมเราสามารถสร้างpipขั้นตอนที่ไม่ได้เชื่อมต่อได้ในเวลาประมาณ 65 วินาที:

$ export DOCKER_BUILDKIT=1
$ docker build -t test .
[+] Building 65.6s (10/10) FINISHED                                                                                                                                             
 => [internal] load .dockerignore                                                                                                                                          0.0s
 => => transferring context: 2B                                                                                                                                            0.0s
 => [internal] load build definition from Dockerfile                                                                                                                       0.0s
 => => transferring dockerfile: 120B                                                                                                                                       0.0s
 => [internal] load metadata for docker.io/library/python:3.7                                                                                                              0.5s
 => CACHED [1/4] FROM docker.io/library/python:3.7@sha256:6eaf19442c358afc24834a6b17a3728a45c129de7703d8583392a138ecbdb092                                                 0.0s
 => [internal] load build context                                                                                                                                          0.6s
 => => transferring context: 899.99kB                                                                                                                                      0.6s
 => CACHED [internal] helper image for file operations                                                                                                                     0.0s
 => [2/4] COPY requirements.txt /usr/src/app/                                                                                                                              0.5s
 => [3/4] RUN pip install -r requirements.txt                                                                                                                             61.3s
 => [4/4] COPY . /usr/src/app                                                                                                                                              1.3s
 => exporting to image                                                                                                                                                     1.2s
 => => exporting layers                                                                                                                                                    1.2s
 => => writing image sha256:d66a2720e81530029bf1c2cb98fb3aee0cffc2f4ea2aa2a0760a30fb718d7f83                                                                               0.0s
 => => naming to docker.io/library/test                                                                                                                                    0.0s

ตอนนี้ให้เราเพิ่มส่วนหัวการทดลองและแก้ไขRUNขั้นตอนในการแคชแพ็คเกจ Python:

# syntax=docker/dockerfile:experimental

FROM python:3.7
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app/
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt
COPY . /usr/src/app

ดำเนินการสร้างใหม่ทันที ควรใช้เวลาเท่ากัน แต่คราวนี้มันกำลังแคชแพ็คเกจ Python ในแคชเมาท์ใหม่ของเรา:

$ docker build -t pythontest .
[+] Building 60.3s (14/14) FINISHED                                                                                                                                             
 => [internal] load build definition from Dockerfile                                                                                                                       0.0s
 => => transferring dockerfile: 120B                                                                                                                                       0.0s
 => [internal] load .dockerignore                                                                                                                                          0.0s
 => => transferring context: 2B                                                                                                                                            0.0s
 => resolve image config for docker.io/docker/dockerfile:experimental                                                                                                      0.5s
 => CACHED docker-image://docker.io/docker/dockerfile:experimental@sha256:9022e911101f01b2854c7a4b2c77f524b998891941da55208e71c0335e6e82c3                                 0.0s
 => [internal] load .dockerignore                                                                                                                                          0.0s
 => [internal] load build definition from Dockerfile                                                                                                                       0.0s
 => => transferring dockerfile: 120B                                                                                                                                       0.0s
 => [internal] load metadata for docker.io/library/python:3.7                                                                                                              0.5s
 => CACHED [1/4] FROM docker.io/library/python:3.7@sha256:6eaf19442c358afc24834a6b17a3728a45c129de7703d8583392a138ecbdb092                                                 0.0s
 => [internal] load build context                                                                                                                                          0.7s
 => => transferring context: 899.99kB                                                                                                                                      0.6s
 => CACHED [internal] helper image for file operations                                                                                                                     0.0s
 => [2/4] COPY requirements.txt /usr/src/app/                                                                                                                              0.6s
 => [3/4] RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt                                                                                  53.3s
 => [4/4] COPY . /usr/src/app                                                                                                                                              2.6s
 => exporting to image                                                                                                                                                     1.2s
 => => exporting layers                                                                                                                                                    1.2s
 => => writing image sha256:0b035548712c1c9e1c80d4a86169c5c1f9e94437e124ea09e90aea82f45c2afc                                                                               0.0s
 => => naming to docker.io/library/test                                                                                                                                    0.0s

ประมาณ 60 วินาที คล้ายกับงานสร้างครั้งแรกของเรา

ทำการเปลี่ยนแปลงเล็กน้อยrequirements.txt(เช่นการเพิ่มบรรทัดใหม่ระหว่างสองแพ็คเกจ) เพื่อบังคับให้แคชไม่ถูกต้องและเรียกใช้อีกครั้ง:

$ docker build -t pythontest .
[+] Building 15.9s (14/14) FINISHED                                                                                                                                             
 => [internal] load build definition from Dockerfile                                                                                                                       0.0s
 => => transferring dockerfile: 120B                                                                                                                                       0.0s
 => [internal] load .dockerignore                                                                                                                                          0.0s
 => => transferring context: 2B                                                                                                                                            0.0s
 => resolve image config for docker.io/docker/dockerfile:experimental                                                                                                      1.1s
 => CACHED docker-image://docker.io/docker/dockerfile:experimental@sha256:9022e911101f01b2854c7a4b2c77f524b998891941da55208e71c0335e6e82c3                                 0.0s
 => [internal] load build definition from Dockerfile                                                                                                                       0.0s
 => => transferring dockerfile: 120B                                                                                                                                       0.0s
 => [internal] load .dockerignore                                                                                                                                          0.0s
 => [internal] load metadata for docker.io/library/python:3.7                                                                                                              0.5s
 => CACHED [1/4] FROM docker.io/library/python:3.7@sha256:6eaf19442c358afc24834a6b17a3728a45c129de7703d8583392a138ecbdb092                                                 0.0s
 => CACHED [internal] helper image for file operations                                                                                                                     0.0s
 => [internal] load build context                                                                                                                                          0.7s
 => => transferring context: 899.99kB                                                                                                                                      0.7s
 => [2/4] COPY requirements.txt /usr/src/app/                                                                                                                              0.6s
 => [3/4] RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt                                                                                   8.8s
 => [4/4] COPY . /usr/src/app                                                                                                                                              2.1s
 => exporting to image                                                                                                                                                     1.1s
 => => exporting layers                                                                                                                                                    1.1s
 => => writing image sha256:fc84cd45482a70e8de48bfd6489e5421532c2dd02aaa3e1e49a290a3dfb9df7c                                                                               0.0s
 => => naming to docker.io/library/test                                                                                                                                    0.0s

ประมาณ 16 วินาทีเท่านั้น!

เราได้รับการเร่งความเร็วนี้เนื่องจากเราไม่ได้ดาวน์โหลดแพ็คเกจ Python ทั้งหมดอีกต่อไป แคชเหล่านี้ถูกแคชโดยตัวจัดการแพ็กเกจ ( pipในกรณีนี้) และเก็บไว้ในแคชวอลุ่มเมาท์ ไดรฟ์ข้อมูลติดตั้งไว้ในขั้นตอนการรันเพื่อให้pipสามารถนำแพ็กเกจที่ดาวน์โหลดไปแล้วมาใช้ซ้ำได้ นี้เกิดขึ้นภายนอกใด ๆ แคชชั้นเทียบท่า

requirements.txtกำไรที่ควรจะดีกว่ามากในขนาดใหญ่

หมายเหตุ:

  • นี่คือไวยากรณ์ Dockerfile ทดลองและควรได้รับการปฏิบัติเช่นนี้ คุณอาจไม่ต้องการสร้างด้วยสิ่งนี้ในการผลิตในขณะนี้
  • สิ่งต่างๆของ BuildKit ไม่ทำงานภายใต้ Docker Compose หรือเครื่องมืออื่น ๆ ที่ใช้ Docker API โดยตรงในขณะนี้ ขณะนี้มีการรองรับสิ่งนี้ใน Docker Compose ตั้งแต่ 1.25.0 ดูคุณเปิดใช้งาน BuildKit ด้วย Docker-compose ได้อย่างไร?
  • ไม่มีอินเทอร์เฟซโดยตรงสำหรับจัดการแคชในขณะนี้ จะถูกลบเมื่อคุณทำdocker system prune -a.

หวังว่าคุณสมบัติเหล่านี้จะทำให้เป็น Docker สำหรับการสร้างและ BuildKit จะกลายเป็นค่าเริ่มต้น ถ้าเป็นเช่นนั้นฉันจะพยายามอัปเดตคำตอบนี้


ฉันสามารถยืนยันได้ว่าโซลูชันนี้ทำงานได้ดีมาก งานสร้างของฉันลดลงจากนาทีที่แล้วเหลือเพียง 2.2 วินาที ขอบคุณ @ andy-shinn
Kwuite

2
ตอนนี้ยัง Docker-Compose: stackoverflow.com/questions/58592259/…
Rexcirus

หมายเหตุ: หากคุณใช้ SUDO เพื่อรันนักเทียบท่าคุณอาจต้องทำ: sudo DOCKER_BUILDKIT = 1 ...
Vinícius M

ฉันได้รับข้อผิดพลาดนี้: - ล้มเหลวในการแก้ไขด้วย frontend dockerfile.v0: ล้มเหลวในการสร้างคำจำกัดความ LLB: ข้อผิดพลาดในการแยกวิเคราะห์ Dockerfile บรรทัดที่ 10: ค่าสถานะที่ไม่รู้จัก: เมานต์
Mayur Dangar

ดูเหมือนว่าคุณพลาดความคิดเห็นที่ด้านบนของDockerfileหรือเวอร์ชัน Docker เก่าเกินไป ฉันจะสร้างคำถามใหม่พร้อมข้อมูลการแก้ไขข้อบกพร่องทั้งหมดของคุณ
Andy Shinn

-10

ฉันพบว่าวิธีที่ดีกว่าคือเพิ่มไดเร็กทอรี Python site-package เป็นไดรฟ์ข้อมูล

services:
    web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
            - .:/code
            -  /usr/local/lib/python2.7/site-packages/

ด้วยวิธีนี้ฉันสามารถติดตั้งไลบรารีใหม่ได้โดยไม่ต้องสร้างใหม่ทั้งหมด

แก้ไข : ไม่ต้องสนใจคำตอบนี้คำตอบของ jkukulข้างต้นใช้ได้กับฉัน เจตนาของฉันคือแคชโฟลเดอร์แพ็คเกจไซต์ นั่นจะดูเหมือนมากกว่านี้:

volumes:
   - .:/code
   - ./cached-packages:/usr/local/lib/python2.7/site-packages/

การแคชโฟลเดอร์ดาวน์โหลดนั้นสะอาดกว่ามาก นอกจากนี้ยังแคชล้อเพื่อให้ทำงานได้อย่างถูกต้อง


2
และจะเกิดอะไรขึ้นเมื่อคุณพยายามสร้าง Dockerfile บนเครื่องอื่น นี่ไม่ใช่วิธีแก้ปัญหาที่ยั่งยืน
Aaron McMillin

Genuinely confused, this turned out being buggy and I wasn't actually sure why. Could you give some more details.
jaywhy13

3
Your docker image is depending on state from the host system. This voids most of the utility of docker. Everything the image needs should be installed in it. use the Dockerfile to install all the dependancies. If you want to avoid re-downloading the packages every time you build the answer from jkukul to mount the pip cache is the way to go.
Aaron McMillin

2
Lightbulb just went off thanks. I was actually trying to mount the site-packages directory from the VM, not the host. Quite an oversight. I think in spirit I was trying to do the same as jkulkul suggested.Thanks for the clarity!
jaywhy13

@AaronMcMillin He is actually not depending on a path on the host. He's mounting the site-packages in the container to an anonymous volume. Still a bad idea though
ruohola
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.