장애가 발생한 도커 빌드의 파일 시스템을 검사하려면 어떻게 해야 합니까?
.cpanm여러 Perl 모듈을 다양한 프로젝트의 기본 이미지로 설치합니다.
도커 파일을 개발하는 동안,cpanm일부 모듈이 새로 설치되지 않았기 때문에 오류 코드를 반환합니다.
나는 내가 필요하다고 꽤 확신합니다.apt더 많은 것들을 설치하기 위해.
어디서 찾을 수 있습니까?/.cpanm/work로그를 검사하기 위해 출력에 인용된 디렉토리입니까?일반적으로 장애가 발생한 파일 시스템을 검사하려면 어떻게 해야 합니까?docker build명령?
을 한 후find나는 발견했습니다.
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
이것이 신뢰할 수 있을까요, 아니면 "맨날" 컨테이너를 만들고 필요한 모든 것을 얻을 때까지 수동으로 실행하는 것이 더 나은가요?
마다 "Docker"가 실행됩니다.RUNDocker 파일에서 명령하면 이미지 파일 시스템의 새 계층이 커밋됩니다.이러한 도면층 ID를 이미지로 사용하여 새 컨테이너를 시작할 수 있습니다.
다음 도커 파일을 가져옵니다.
FROM busybox
RUN echo 'foo' > /tmp/foo.txt
RUN echo 'bar' >> /tmp/foo.txt
빌드: (DOCKER_B를 설정하면 이미지 계층 ID를 볼 수 있습니다.UILDKIT=0)
$ DOCKER_BUILDKIT=0 docker build -t so-26220957 .
Sending build context to Docker daemon 47.62 kB
Step 1/3 : FROM busybox
---> 00f017a8c2a6
Step 2/3 : RUN echo 'foo' > /tmp/foo.txt
---> Running in 4dbd01ebf27f
---> 044e1532c690
Removing intermediate container 4dbd01ebf27f
Step 3/3 : RUN echo 'bar' >> /tmp/foo.txt
---> Running in 74d81cb9d2b1
---> 5bd8172529c1
Removing intermediate container 74d81cb9d2b1
Successfully built 5bd8172529c1
이새컨너이를수있다니습시작할제테에서 새 할 수 .00f017a8c2a6,044e1532c690그리고.5bd8172529c1:
$ docker run --rm 00f017a8c2a6 cat /tmp/foo.txt
cat: /tmp/foo.txt: No such file or directory
$ docker run --rm 044e1532c690 cat /tmp/foo.txt
foo
$ docker run --rm 5bd8172529c1 cat /tmp/foo.txt
foo
bar
물론 셸을 시작하여 파일 시스템을 탐색하고 다음 명령을 사용해 보십시오.
$ docker run --rm -it 044e1532c690 sh
/ # ls -l /tmp
total 4
-rw-r--r-- 1 root root 4 Mar 9 19:09 foo.txt
/ # cat /tmp/foo.txt
foo
Dockerfile 명령 중 하나가 실패하면 이전 계층의 ID를 찾고 해당 ID로 생성된 컨테이너에서 셸을 실행해야 합니다.
docker run --rm -it <id_last_working_layer> bash -il
용기에 한 번 넣으면 됩니다.
- 실패한 명령을 시도하고 문제를 재현합니다.
- 그런 다음 명령을 수정하고 테스트합니다.
- 마지막으로 고정 명령으로 도커 파일을 업데이트합니다.
마지막 작업 계층에서 작업하는 대신 실패한 실제 계층에서 실험해야 하는 경우 Drew의 답변을 참조하십시오.
실패한 명령 직전에 상태를 검사하려는 경우 상위 답변이 작동합니다.
그러나 문제는 실패한 컨테이너 자체의 상태를 검사하는 방법을 묻는 것입니다.내 상황에서 실패한 명령은 몇 시간이 걸리는 빌드이므로 실패한 명령에 앞서 다시 감았다가 다시 실행하는 것은 시간이 오래 걸리고 큰 도움이 되지 않습니다.
여기서 해결책은 실패한 컨테이너를 찾는 것입니다.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6934ada98de6 42e0228751b3 "/bin/sh -c './utils/" 24 minutes ago Exited (1) About a minute ago sleepy_bell
이미지에 커밋:
$ docker commit 6934ada98de6
sha256:7015687976a478e0e94b60fa496d319cdf4ec847bcd612aecf869a72336e6b83
그런 다음 이미지를 실행합니다(필요한 경우 bash 실행).
$ docker run -it 7015687976a4 [bash -il]
이제 장애를 일으킨 명령을 실행하기 전이 아니라 장애가 발생한 시점의 빌드 상태를 확인할 수 있습니다.
최신 도커 버전 20.10 이상 업데이트
Linux 또는 macOS
DOCKER_BUILDKIT=0 docker build ...
창문들
# Command line
set DOCKER_BUILDKIT=0 docker build ...
# PowerShell
$env:DOCKER_BUILDKIT=0
사용하다DOCKER_BUILDKIT=0 docker build ...이전 버전에서 알려진 중간 컨테이너 해시를 가져옵니다.
최신 버전에서는 빌드킷이 기본적으로 활성화됩니다.디버깅 목적으로만 사용하는 것이 좋습니다.빌드 키트를 사용하면 빌드 속도를 높일 수 있습니다.
참조용:빌드킷은 중간 컨테이너 해시를 지원하지 않습니다. https://github.com/moby/buildkit/issues/1053
@David Callanan과 @MegaCookie의 의견에 감사드립니다.
각 성공 후 Docker가 전체 파일 시스템 상태를 캐시합니다.RUN선.
알고 있는 것:
- 실패하기 전에 최근 상태를 조사하는 것
RUN명령, Docker 파일(및 이후의 모든 파일)에 주석 달기RUN명령), 실행docker build그리고.docker run다시. - 실패 후의 상태를 조사하다
RUN명령, 단순 추가|| true그것이 성공하도록 강요하기 위해; 그리고 위와 같이 계속합니다. (모든 것과 이후를 유지합니다.)RUN명령이 주석 처리됨, 실행docker build그리고.docker run)
Tada, Docker 내부 또는 계층 ID를 조작할 필요가 없으며, 추가적으로 Docker는 자동으로 다시 수행해야 하는 작업량을 최소화합니다.
현재 최신 도커 브라우저에서는 디버깅을 아직 지원하지 않는 새 빌드킷을 종료할 수 있는 방법이 없습니다(이 GitHub 스레드에 대한 최신 업데이트를 참조하십시오: https://github.com/moby/buildkit/issues/1472) ).
- 도커 파일의 어느 줄에서 오류가 발생하는지 확인합니다.
- 도커 파일의 맨 위에 추가:
FROM xxx as debug - 대상을 추가합니다.
FROM xxx as next실패한 명령 앞에 한 줄만 표시합니다(해당 부품을 빌드하지 않으려는 경우).예:
FROM xxx as debug
RUN echo "working command"
FROM xxx as next
RUN echoo "failing command"
- 달려.
docker build -f Dockerfile --target debug --tag debug . - 그런 다음 다음을 사용하여 컨테이너를 디버그할 수 있습니다.
docker run -it debug /bin/sh
CTRL P + CTRL Q를 눌러 셸을 종료할 수 있습니다.
사용할 경우docker compose build대신에docker build추가하면 가능합니다.target: debug아래의 도커-docker.yml에 있습니다.
그런 다음 컨테이너를 시작합니다.docker compose run xxxYourServiceNamexxx다음 중 하나를 사용합니다.
디버깅 빌드 단계 실패는 정말로 매우 성가신 일입니다.
제가 찾은 가장 좋은 해결책은 실제 작업을 수행하는 각 단계가 성공적인지 확인하고 실패한 단계 이후에 체크를 추가하는 것입니다.이렇게 하면 검사할 수 있는 실패한 단계의 출력이 포함된 커밋된 레이어를 얻을 수 있습니다.
파일, " " " " 뒤에 .# Run DB2 silent installer표시:
#
# DB2 10.5 Client Dockerfile (Part 1)
#
# Requires
# - DB2 10.5 Client for 64bit Linux ibm_data_server_runtime_client_linuxx64_v10.5.tar.gz
# - Response file for DB2 10.5 Client for 64bit Linux db2rtcl_nr.rsp
#
#
# Using Ubuntu 14.04 base image as the starting point.
FROM ubuntu:14.04
MAINTAINER David Carew <carew@us.ibm.com>
# DB2 prereqs (also installing sharutils package as we use the utility uuencode to generate password - all others are required for the DB2 Client)
RUN dpkg --add-architecture i386 && apt-get update && apt-get install -y sharutils binutils libstdc++6:i386 libpam0g:i386 && ln -s /lib/i386-linux-gnu/libpam.so.0 /lib/libpam.so.0
RUN apt-get install -y libxml2
# Create user db2clnt
# Generate strong random password and allow sudo to root w/o password
#
RUN \
adduser --quiet --disabled-password -shell /bin/bash -home /home/db2clnt --gecos "DB2 Client" db2clnt && \
echo db2clnt:`dd if=/dev/urandom bs=16 count=1 2>/dev/null | uuencode -| head -n 2 | grep -v begin | cut -b 2-10` | chgpasswd && \
adduser db2clnt sudo && \
echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# Install DB2
RUN mkdir /install
# Copy DB2 tarball - ADD command will expand it automatically
ADD v10.5fp9_linuxx64_rtcl.tar.gz /install/
# Copy response file
COPY db2rtcl_nr.rsp /install/
# Run DB2 silent installer
RUN mkdir /logs
RUN (/install/rtcl/db2setup -t /logs/trace -l /logs/log -u /install/db2rtcl_nr.rsp && touch /install/done) || /bin/true
RUN test -f /install/done || (echo ERROR-------; echo install failed, see files in container /logs directory of the last container layer; echo run docker run '<last image id>' /bin/cat /logs/trace; echo ----------)
RUN test -f /install/done
# Clean up unwanted files
RUN rm -fr /install/rtcl
# Login as db2clnt user
CMD su - db2clnt
저의 경우, 저는 다음을 가져야 합니다.
DOCKER_BUILDKIT=1 docker build ...
그리고 Jannis Schönleber가 답변에서 언급한 바와 같이, 현재 이 경우에 사용할 수 있는 디버그는 없습니다(즉, 중간 이미지/컨테이너가 생성되지 않음).
제가 할 수 있는 일은 다음과 같은 옵션을 사용하는 것입니다.
... --progress=plain ...
그리고 다양한 것을 추가합니다.RUN ... 기존 또기 존추라인가에 이 있습니다.RUN ...특정 명령을 디버그합니다.이를 통해 전체 액세스가 가능하다는 느낌을 받을 수 있습니다(적어도 빌드가 비교적 빠른 경우).
예를 들어 다음과 같은 변수를 확인할 수 있습니다.
RUN echo "Variable NAME = [$NAME]"
파일이 제대로 설치되어 있는지 궁금하면 다음을 수행합니다.
RUN find /
기타.
제 상황에서는 개인 저장소가 있는 바둑 응용 프로그램의 도커 빌드를 디버깅해야 했고 디버깅을 하는 것은 꽤 어려웠습니다.여기에 다른 세부사항이 있습니다.
사중인경우를 .docker-compose도커 이미지를 빌드하려면 추가를 시도합니다.DOCKER_BUILDKIT=0인 계층 ID를에 ID를 표시합니다.
DOCKER_BUILDKIT=0 docker-compose ...
그러면 일시적으로 DOKER_B가 비활성화됩니다.명령 전용 UILDKIT입니다.
마지막 계층 ID가 있으면 상단 답변의 명령을 사용하여 연결할 수 있습니다.
docker run --rm -it LAST_LAYER_ID sh
파일에서 입니다.RUN bundle install 우경에는제,는제우경에.
로 변경합니다.
RUN bundle install || cat <path to the file containing the error>
이는 고장의 원인을 출력하는 이중 효과가 있으며, 이 중간 단계는 도커 빌드에 의해 고장으로 파악되지 않습니다.삭제되지 않으며 다음을 통해 검사할 수 있습니다.
docker run --rm -it <id_last_working_layer> bash -il
여기서 실패한 명령을 다시 실행하여 실시간으로 테스트할 수도 있습니다.
제가 할 일은 아래 도커 파일에 대해 의견을 제시하고 위반 사항을 포함하는 것입니다.그런 다음 컨테이너를 실행하고 도커 명령을 수동으로 실행하여 일반적인 방법으로 로그를 확인할 수 있습니다.예: Docker 파일이 다음과 같은 경우
RUN foo
RUN bar
RUN baz
술집에서 죽어가고 있어요
RUN foo
# RUN bar
# RUN baz
그리고나서
$ docker build -t foo .
$ docker run -it foo bash
container# bar
...grep logs...
Alexis Wilke의 답변과 같이 BuildKit를 사용하면서도 사용할 수 있습니다.
토쿠나가 코헤이의 "도커 파일용 대화형 디버거"를 참조하십시오.
buildg으로 Docker 입니다.
- 소스 레벨 검사
- 중단점 및 단계 실행
- 자체 디버그 도구를 사용하여 단계별 대화형 셸 제공
- BuildKit 기반(통합되지 않은 패치 필요)
- 루트리스 지원
예:
$ buildg.sh debug --image=ubuntu:22.04 /tmp/ctx
WARN[2022-05-09T01:40:21Z] using host network as the default
#1 [internal] load .dockerignore
#1 transferring context: 2B done
#1 DONE 0.1s
#2 [internal] load build definition from Dockerfile
#2 transferring dockerfile: 195B done
#2 DONE 0.1s
#3 [internal] load metadata for docker.io/library/busybox:latest
#3 DONE 3.0s
#4 [build1 1/2] FROM docker.io/library/busybox@sha256:d2b53584f580310186df7a2055ce3ff83cc0df6caacf1e3489bff8cf5d0af5d8
#4 resolve docker.io/library/busybox@sha256:d2b53584f580310186df7a2055ce3ff83cc0df6caacf1e3489bff8cf5d0af5d8 0.0s done
#4 sha256:50e8d59317eb665383b2ef4d9434aeaa394dcd6f54b96bb7810fdde583e9c2d1 772.81kB / 772.81kB 0.2s done
Filename: "Dockerfile"
2| RUN echo hello > /hello
3|
4| FROM busybox AS build2
=> 5| RUN echo hi > /hi
6|
7| FROM scratch
8| COPY --from=build1 /hello /
>>> break 2
>>> breakpoints
[0]: line 2
>>> continue
#4 extracting sha256:50e8d59317eb665383b2ef4d9434aeaa394dcd6f54b96bb7810fdde583e9c2d1 0.0s done
#4 DONE 0.3s
...
언급URL : https://stackoverflow.com/questions/26220957/how-can-i-inspect-the-file-system-of-a-failed-docker-build
'programing' 카테고리의 다른 글
| python으로 Excel 호환 CSV 파일을 생성하시겠습니까? (0) | 2023.08.19 |
|---|---|
| jQuery AJAX를 사용하는 서버에 null을 전달할 수 없습니다.서버에서 수신된 값이 "null" 문자열입니다. (0) | 2023.08.19 |
| 'git credential-osxkeychain'에 저장된 자격 증명을 어떻게 재설정합니까? (0) | 2023.08.19 |
| 페이지 새로 고침 후 입력 값 유지 (0) | 2023.08.19 |
| Twitter 부트스트랩 경고 메시지가 닫혔다가 다시 열립니다. (0) | 2023.08.19 |