Điểm:3

apt cập nhật hành vi khác trong Dockerfile và lời nhắc, trả về mã lỗi 100 nhưng vẫn hoạt động

lá cờ kr

Tôi đang cố gắng cài đặt một nguồn apt trên docker chức năng Azure của Microsoft, đây là Dockerfile của tôi

TỪ mcr.microsoft.com/azure-functions/python:3.0-python3.9

CHẠY echo 'deb [trusted=yes] http://deb.debian.org/debian testing main' > /etc/apt/sources.list.d/testing.list
CHẠY bản cập nhật apt -y

Điều này không thành công trong cập nhật apt -y bước với lỗi sau

CẢNH BÁO: apt không có giao diện CLI ổn định. Sử dụng thận trọng trong các tập lệnh.

Nhận:1 http://deb.debian.org/debian buster InRelease [122 kB]
Nhận:2 http://security.debian.org/debian-security buster/updates InRelease [65,4 kB]
Lần truy cập:3 http://security.debian.org/debian-security jessie/updates InRelease
Nhận:4 http://deb.debian.org/debian buster-updates InRelease [51,9 kB]
Nhận:5 https://packages.microsoft.com/debian/9/prod stretch InRelease [4009 B]
Nhận:6 http://deb.debian.org/debian testing InRelease [112 kB]
Nhận:7 https://packages.microsoft.com/debian/9/prod stretch/main AMD64 Gói [161 kB]
Nhận:8 http://deb.debian.org/debian testing/main AMD64 Packages [8248 kB]
Đang đọc danh sách gói...
E: Kho lưu trữ 'http://security.debian.org/debian-security buster/updates InRelease' đã thay đổi giá trị 'Suite' của nó từ 'stable' thành 'oldstable'
E: Kho lưu trữ 'http://deb.debian.org/debian buster InRelease' đã thay đổi giá trị 'Suite' của nó từ 'stable' thành 'oldstable'
E: Kho lưu trữ 'http://deb.debian.org/debian buster-updates InRelease' đã thay đổi giá trị 'Suite' của nó từ 'stable-updates' thành 'oldstable-updates'
Lệnh '/bin/sh -c apt update -y' trả về mã khác 0: 100

Nhưng mà:

  • nếu tôi chạy chính xác hai lệnh sau khi khởi chạy docker chạy --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9, cập nhật apt -y hoạt động tốt,
  • nếu tôi thay đổi hình ảnh cơ sở thành debian:buster-mỏng dựa trên hình ảnh nào, bản dựng docker hoạt động tốt,
  • ngay cả khi lệnh không thành công, tôi có thể cài đặt gói từ thử nghiệm, ví dụ., cập nhật apt -y || cài đặt apt g ++ sẽ cài đặt g++-10 thay vì mặc định g++-8 trên Buster.

Bất kỳ ý tưởng tại sao lệnh thất bại? Và làm thế nào tôi có thể sửa chữa nó?


Chỉnh sửa: Thêm --allow-releaseinfo-change đến cập nhật apt -y trong dockerfile đã khắc phục sự cố, nhưng tôi vẫn muốn biết tại sao nó không thành công mà không có?


Ghi chú: Câu hỏi được chuyển từ SO vì nó dường như lạc đề ở đó... Hãy cho tôi biết nếu nó cũng lạc đề ở đây.

Michael Hampton avatar
lá cờ cz
Những repo apt đó là một mớ hỗn độn. Ai đã tạo vùng chứa mà bạn đang sử dụng làm cơ sở? Tôi sẽ không ngạc nhiên nếu không có gì hoạt động trên đó.
lá cờ kr
@MichaelHampton Đây là hình ảnh chính thức cho chức năng ứng dụng Python được cập nhật trên Azure. Dockerfile có thể được tìm thấy ở đây https://github.com/Azure/azure-functions-docker/blob/dev/host/3.0/buster/amd64/python/python39/python39.Dockerfile
Điểm:3
lá cờ br

TL;DR

Vấn đề gốc là một lỗi trong hình ảnh cơ sở mà bạn đang sử dụng. Cách khắc phục vĩnh viễn là xóa /var/lib/apt/danh sách trong Dockerfile hình ảnh cơ sở, nhưng nó có thể được xử lý tạm thời bằng cách xây dựng lại hình ảnh cơ sở hoặc sử dụng --allow-releaseinfo-change Tùy chọn.

Lý do tại sao hành vi này khác nhau giữa xây dựng dockerdocker chạy -it là việc sử dụng -t cờ để phân bổ một tty. Điều này làm thay đổi hành vi của apt -y (APT::Nhận::Giả sử-Có).

giải thích đầy đủ

Kho lưu trữ ... đã thay đổi giá trị 'Suite' của nó

Lỗi này xảy ra khi:

  1. APT có phiên bản được lưu trong bộ nhớ cache của tệp Phát hành -- Đây là lỗi. Hình ảnh cơ sở Docker nói chung nên làm sạch bộ đệm này.
  2. Repo từ xa có phiên bản mới hơn
  3. Một số trường không khớp giữa hai phiên bản

Trong một môi trường không docker, kiểm tra này là dự định để bảo vệ người dùng khỏi việc cài đặt đột ngột và bất ngờ các gói từ một bản phát hành Debian khác.

Trong trường hợp này, hình ảnh cơ sở mcr.microsoft.com/azure-functions/python:3.0-python3.9 chứa chứa các phiên bản được lưu trong bộ nhớ đệm của các tệp Phát hành Debian buster (điều kiện #1) với Bộ: ổn định, bởi vì đó là hiện tại tại thời điểm nó được xây dựng.

Tuy nhiên, bản sao chính trong Kho lưu trữ Debian mới hơn (điều kiện #2), và bây giờ đã có Suite: oldstable (điều kiện #3), vì Debian 10 buster đã được thay thế bởi Debian 11 bullseye.

Vì vậy, khi bạn cố gắng chạy cập nhật apt trên hình ảnh cơ sở này, nó không thành công vì không phù hợp giữa phiên bản được lưu trong bộ nhớ cache cũ và phiên bản hiện tại.

Tôi đã thử Dockerfile của bạn ngay bây giờ (2021-09-03) và nó hoạt động tốt với tôi. Điều này có thể là do nó đã được xây dựng lại kể từ khi bạn đăng câu hỏi này. Điều này sẽ khiến nó lưu vào bộ nhớ đệm các tệp Phát hành mới từ kho lưu trữ Debian, sửa lỗi không khớp (#2/#3 ở trên không còn đúng nữa).

Tuy nhiên, bạn có thể xác minh rằng lỗi vẫn còn đó:

$ docker run --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9               
root@722ec78233b4:/# grep Suite /var/lib/apt/lists/*Release
/var/lib/apt/lists/deb.debian.org_debian_dists_buster-updates_InRelease:Suite: oldstable-updates
/var/lib/apt/lists/deb.debian.org_debian_dists_buster_InRelease:Suite: oldstable
/var/lib/apt/lists/packages.microsoft.com_debian_9_prod_dists_stretch_InRelease:Suite: stretch
/var/lib/apt/lists/security.debian.org_debian-security_dists_buster_updates_InRelease:Suite: oldstable
/var/lib/apt/lists/security.debian.org_debian-security_dists_jessie_updates_InRelease:Suite: oldoldstable

Và lỗi tương tự sẽ lặp lại sau bản phát hành Debian tiếp theo, khi buster trở thành cũổn định và mắt bò trở thành chuồng cũ.

Gần đây, tôi đã gặp sự cố tương tự với hình ảnh cơ sở docker không liên quan và tôi nghĩ rằng lỗi này khá phổ biến.

hành vi của -y Tùy chọn

Khi bạn chạy đúng cách với một tty như stdin, -y sẽ ghi đè kiểm tra này và cho phép cập nhật lệnh thành công. Tuy nhiên, nếu không có tty (phiên không tương tác), -y Tùy chọn sẽ không ghi đè lên kiểm tra này. Tôi đã xác nhận điều này bằng phiên bản cũ hơn của hình ảnh lỗi:

# phá thai    
docker run --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y

# thành công
docker run -t --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y

# lời nhắc để y/N tiếp tục
docker run -it --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update

# phá thai
docker run --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update
lá cờ kr
Cảm ơn câu trả lời, điều này không giải thích tại sao mã hoạt động tốt khi chạy trực tiếp vào vùng chứa so với trong Dockerfile, bạn có biết không?
lá cờ br
Nó hoạt động tốt với tôi trong cả hai trường hợp (docker build và docker run), vì hình ảnh đã được cập nhật. Bạn vẫn có thể sao chép điều này không và nếu vậy, bạn có thể đăng đầu ra của `docker image ls http://mcr.microsoft.com/azure-functions/python:3.0-python3.9` (cụ thể là ID hình ảnh) không?
lá cờ kr
Rất tiếc, tôi cũng đã cập nhật hình ảnh nên không thể sao chép được nữa... Nếu tôi thấy ID hình ảnh cụ thể không hoạt động, tôi sẽ cho bạn biết.
lá cờ br
Tôi đã tìm thấy phiên bản cũ của hình ảnh và có thể tái tạo hành vi. Đã thêm giải thích

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.