
Microsoft Azure 함수 Docker에 적절한 소스를 설치하려고 합니다. 여기 내 Dockerfile이 있습니다.
FROM mcr.microsoft.com/azure-functions/python:3.0-python3.9
RUN echo 'deb [trusted=yes] http://deb.debian.org/debian testing main' > /etc/apt/sources.list.d/testing.list
RUN apt update -y
apt update -y
다음 오류로 인해 단계 에서 실패합니다.
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
Get:1 http://deb.debian.org/debian buster InRelease [122 kB]
Get:2 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Hit:3 http://security.debian.org/debian-security jessie/updates InRelease
Get:4 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Get:5 https://packages.microsoft.com/debian/9/prod stretch InRelease [4009 B]
Get:6 http://deb.debian.org/debian testing InRelease [112 kB]
Get:7 https://packages.microsoft.com/debian/9/prod stretch/main amd64 Packages [161 kB]
Get:8 http://deb.debian.org/debian testing/main amd64 Packages [8248 kB]
Reading package lists...
E: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Suite' value from 'stable' to 'oldstable'
E: Repository 'http://deb.debian.org/debian buster InRelease' changed its 'Suite' value from 'stable' to 'oldstable'
E: Repository 'http://deb.debian.org/debian buster-updates InRelease' changed its 'Suite' value from 'stable-updates' to 'oldstable-updates'
The command '/bin/sh -c apt update -y' returned a non-zero code: 100
하지만:
docker run --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9
을 ( 를) 시작한 후 정확히 동일한 두 명령을 실행하면apt update -y
제대로 작동합니다.debian:buster-slim
이미지의 기반이 되는 기본 이미지를 변경하면 docker 빌드가 제대로 작동합니다.- 명령이 실패하더라도 에서 패키지를 설치할 수 있습니다
testing
. 예를 들어 Buster의 기본값 대신apt update -y || apt install g++
설치됩니다 .g++-10
g++-8
명령이 실패하는 이유를 아시나요? 어떻게 해결할 수 있나요?
편집하다:--allow-releaseinfo-change
dockerfile 에 추가하면 apt update -y
문제가 해결되었지만 여전히 알고 싶습니다.왜없이는 실패했나요?
메모:질문은 분명히 주제에서 벗어난 것 같아서 SO에서 옮겨졌습니다. 여기서도 주제에서 벗어나면 알려주세요.
답변1
TL;DR
근본적인 문제는 사용 중인 기본 이미지의 버그입니다. 영구적인 수정은 기본 이미지 Dockerfile을 지우는 것이지만 /var/lib/apt/lists
기본 이미지를 다시 빌드하거나 옵션을 사용하여 일시적으로 해결할 수 있습니다 --allow-releaseinfo-change
.
이 동작이 다른 이유 docker build
는 tty를 할당하기 위해 플래그 docker run -it
를 사용하기 때문입니다 . 이는 ( ) -t
의 동작을 변경합니다 .apt -y
APT::Get::Assume-Yes
전체 설명
저장소 ... 'Suite' 값을 변경했습니다.
이 오류는 다음과 같은 경우에 발생합니다.
- APT에는 릴리스 파일의 캐시된 버전이 있습니다.이것이 버그입니다. Docker 기본 이미지는 일반적으로 이 캐시를 정리해야 합니다.
- 원격 저장소에 최신 버전이 있습니다.
- 두 버전 간에 특정 필드가 일치하지 않습니다.
Docker가 아닌 환경에서는이 검사는 의도된 것입니다사용자가 갑자기 예기치 않게 다른 데비안 릴리스의 패키지를 설치하는 것을 방지합니다.
이 경우 기본 이미지에는 다음이 mcr.microsoft.com/azure-functions/python:3.0-python3.9
포함됩니다 .데비안 버스터 릴리스 파일의 캐시된 버전(조건 #1) 을 사용합니다 Suite: stable
. 이는 빌드 당시 최신 버전이었기 때문입니다.
그러나 마스터 사본은데비안 아카이브가 최신입니다(조건 #2), 이제 Suite: oldstable
(조건 #3)이 있습니다. 데비안 10 버스터가대체됨데비안 11 불스아이.
따라서 이 기본 이미지에서 실행하려고 하면 apt update
실패합니다.불일치이전 캐시 버전과 현재 버전 사이.
방금(2021-09-03) Dockerfile을 사용해 보았는데 괜찮게 작동했습니다. 이 질문을 게시한 이후로 다시 작성되었기 때문일 수 있습니다. 이로 인해 Debian 아카이브에서 새 릴리스 파일을 캐시하여 불일치를 수정했을 것입니다(위의 #2/#3은 더 이상 사실이 아닙니다).
그러나 버그가 여전히 존재하는지 확인할 수 있습니다.
$ 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
oldoldstable
그리고 Buster가 되고 Bullseye가 가 되는 다음 데비안 릴리스 이후에도 동일한 오류가 반복됩니다 oldstable
.
최근에 관련 없는 Docker 기본 이미지에서 비슷한 문제를 보았는데, 이 버그가 상당히 널리 퍼져 있는 것 같습니다.
-y
옵션 의 동작
apt
tty를 stdin으로 실행하면 -y
이 검사가 무시되고 update
명령이 성공할 수 있습니다. 그러나 tty(비대화형 세션)가 없는 경우 -y
옵션은재정의하지 않습니다이 수표. 이전 버전의 버그 이미지를 사용하여 이를 확인했습니다.
# aborts
docker run --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y
# succeeds
docker run -t --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y
# prompts for y/N to continue
docker run -it --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update
# aborts
docker run --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update