programing

도커 빌드에서 명령 출력이 표시되지 않는 이유는 무엇입니까?

goodsources 2023. 8. 29. 20:29
반응형

도커 빌드에서 명령 출력이 표시되지 않는 이유는 무엇입니까?

내 스니펫Dockerfile:

FROM node:12.18.0
RUN echo "hello world"
RUN psql --version

실행할 때docker build .이 두 명령어는 캐시되지 않더라도 출력이 표시되지 않습니다.문서에는 다음과 같이 나와 있습니다.docker build기본적으로 상세합니다.명령의 출력이 표시되지 않는 이유는 무엇입니까?전에 그들을 본 적이 있습니다.

빌드 중 출력:

=> [7/18] RUN echo "hello world"                         0.9s

빌드가 완료된 후 표시되는 출력:

=> CACHED [6/18] RUN apt-get install postgresql -y      0.0s
=> [7/18] RUN echo "hello world"                        6.4s
=> [8/18] RUN psql --version                           17.1s

DockerfileDebian 9를 기반으로 하는 노드:12.18.0에서 생성됩니다.

도커 버전 19.03.13, 빌드 4484c46d9d.

현재 표시된 출력은 도커와 함께 제공되는 기존 빌드 엔진을 대체하는 빌드 키트에서 나온 것입니다.다음을 사용하여 이 출력을 조정할 수 있습니다.--progress옵션:

  --progress string         Set type of progress output (auto, plain, tty). Use plain to show container output
                            (default "auto")

추가 중--progress=plain캐시에서 로드되지 않은 실행 명령의 출력을 표시합니다.이 작업은 다음을 설정하여 수행할 수도 있습니다.BUILDKIT_PROGRESS변수:

export BUILDKIT_PROGRESS=plain

빌드를 디버깅할 때 단계가 이미 캐시된 경우 추가--no-cache빌드로 이동하여 단계를 다시 실행하고 출력을 다시 표시합니다.

docker build --progress=plain --no-cache ...

빌드 키트를 사용하지 않으려는 경우 내보내기를 통해 이전 빌드 엔진으로 되돌릴 수 있습니다.DOCKER_BUILDKIT=0당신의 껍질 안에, 예:

DOCKER_BUILDKIT=0 docker build ...

또는

export DOCKER_BUILDKIT=0
docker build ...

이 플래그를 사용하십시오.--progress=plain끝나고build.

예:

docker-compose build --progress=plain <container_name>

OR

docker build --progress=plain .

매번 이 플래그를 사용하지 않으려면 도커에게 다음을 수행하여 이 플래그를 사용하도록 영구적으로 알려줍니다.

export BUILDKIT_PROGRESS=plain

다음은 입력 시 공식 문서입니다.docker build --help.

--progress string         Set type of progress output (auto, plain, tty). Use plain to show container output (default "auto")

도커 20.10에서는 --no-cache 플래그도 사용해야 했습니다.그렇지 않으면 캐시된 출력이 표시되지 않습니다.

docker build --progress=plain --no-cache .

다음을 지정하는 대신--progress=plain옵션을 사용하면 셸 구성에서 이 env 변수를 설정하여 "vmdk" 출력을 영구적으로 비활성화할 수도 있습니다.

export BUILDKIT_PROGRESS=plain

두 가지 일을 하라.

  1. 대신에docker build .이것을 사용합니다.
docker build . --progress=plain
  1. 임의 정크를 에 추가합니다.RUN모든 빌드를 명령합니다(이는 도커가 이전에 명령을 보지 못했다고 생각하도록 속여서 캐시된 버전을 사용하지 않습니다).

를 들면.만약 당신의 명령이RUN ls대신 이것을 사용합니다.RUN ls && echo sdfjskdflsjdf(변경)sdfjskdflsjdf구축할 때마다 다른 용도로).

작동하는 이유

저는 다른 답들을 시도해 보았는데 모두 문제와 불완전함을 제시했습니다.Docker에 다음과 같은 간단한 기능이 없다는 것은 매우 실망스러운 일입니다.--verbose=true.

제가 결국 사용하게 된 것은 다음과 같습니다(황당하지만 효과가 있습니다).

의 출력을 보고 싶다고 가정합니다.ls명령입니다. 작동하지 않습니다.docker build .

RUN ls

하지만 이것은 출력을 인쇄할 것입니다.docker build --progress=plain:

RUN ls

이제 다시 시도해 보세요, 인쇄되지 않습니다! - 도커가 변경되지 않은 레이어를 캐시하기 때문입니다. 따라서 요령은 여기에 넌센스를 추가하여 매번 명령을 변경하는 것입니다.&& echo sdfljsdfljksdfljk그리고 매번 헛소리를 바꾸는 것.docker build --progress=plain:

# This prints
RUN ls && echo sdfljsdfljksdfljk
# Next time you run it use a different token
RUN ls && echo sdlfkjsldfkjlskj

그래서 매번 키보드를 으깨고 새로운 토큰을 생각해냅니다.바보같네요.(참고로 저는 다음과 같은 것을 시도했습니다.&& openssl rand -base64 12무작위 문자열을 생성하지만 도커는 작동하지 않는 코드가 변경되지 않았다는 것을 인식합니다.

이 솔루션은 콘솔에 출력물을 인쇄하기 위한 정품 도커 지원보다 성능이 매우 떨어집니다.

오류가 다음과 같은 경우:

#7 0.584 /bin/sh: 1: /install.sh: not found

그것은 당신에게 오류가 1번 라인에 있다는 것을 알려줍니다. 당신은 윈도우 라인 끝에 부딪히고 있습니다.

나는 VS 코드를 사용하고 있었고, VS 코드를 사용하여 파일을 CRLF에서 LF로 변환하여 꽤 쉽게 해결했습니다.

편집기의 오른쪽 하단 모서리에 있는 CRLF 버튼을 클릭하여 파일을 저장합니다.

지금 이미지를 구축하면 모든 것이 잘 작동할 것입니다.

언급URL : https://stackoverflow.com/questions/64804749/why-is-docker-build-not-showing-any-output-from-commands

반응형