programing

도커: 도커 컨테이너의 로그를 올바르게 지우는 방법은 무엇입니까?

topblog 2023. 8. 31. 23:33
반응형

도커: 도커 컨테이너의 로그를 올바르게 지우는 방법은 무엇입니까?

사용합니다docker logs [container-name]특정 컨테이너의 로그를 확인합니다.

이 통나무들을 치우는 우아한 방법이 있습니까?

첫번째로 나쁜 대답.이 질문에서 실행할 수 있는 하나의 라이너가 있습니다.

echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

에코 대신, 더 간단한 것이 있습니다.

: > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

또는 잘라내기 명령이 있습니다.

truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

저는 두 사람 모두 도커의 파일을 직접 수정하기 때문에 그다지 좋아하지 않습니다. 동안 로그 행이하고 json 파일에서 될 수 .docker logscli. 그런 경우의 예를 보려면 공작 2의 답변에 대한 다음 설명을 참조하십시오.

파일을 후 합니다.error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value

대신 Docker가 로그를 자동으로 순환하도록 할 수 있습니다.작업은 기본 JSON 로깅 드라이버를 사용하는 경우 도킹할 추가 플래그를 사용하여 수행됩니다.

dockerd ... --log-opt max-size=10m --log-opt max-file=3

시작 스크립트를 수정하는 대신 daemon.json 파일의 일부로 설정할 수도 있습니다.

{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

이러한 옵션은 루트 액세스로 구성해야 합니다. 반드시 합니다.systemctl reload docker이 파일을 변경하여 설정을 적용할 수 있습니다.그러면 이 설정이 새로 작성된 컨테이너의 기본값이 됩니다.새 로그 제한을 받으려면 기존 컨테이너를 삭제하고 다시 만들어야 합니다.


유사한 로그 옵션을 개별 컨테이너에 전달하여 이러한 기본값을 재정의할 수 있으므로 개별 컨테이너에 로그를 더 많이 또는 더 적게 저장할 수 있습니다.docker run다음과 같이 표시됩니다.

docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...

또는 작성 파일:

version: '3.7'
services:
  app:
    image: ...
    logging:
      options:
        max-size: "10m"
        max-file: "3"

추가 공간 절약을 위해 json 로그 드라이버에서 "로컬" 로그 드라이버로 전환할 수 있습니다.동일한 max-size 옵션과 max-file 옵션을 사용하지만 json에 저장하는 대신 더 빠르고 더 작은 이진 구문을 사용합니다.이렇게 하면 동일한 크기의 파일에 더 많은 로그를 저장할 수 있습니다.이에 대한 daemon.json 항목은 다음과 같습니다.

{
  "log-driver": "local",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

로컬 드라이버의 단점은 json 로그에 대한 직접 액세스에 의존하는 외부 로그 파서/포워더가 더 이상 작동하지 않는다는 것입니다.따라서 파일비트와 같은 도구를 사용하여 Elastic 또는 Splunk의 범용 전달기(Universal Forwarder)로 전송하면 "로컬" 드라이버를 사용하지 않아도 됩니다.

에 대한 자세한 내용은 팁 및 요령 프레젠테이션에 나와 있습니다.

사용:

truncate -s 0 /var/lib/docker/containers/**/*-json.log

당신은 sudo가 필요할지도 모릅니다.

sudo sh -c "truncate -s 0 /var/lib/docker/containers/**/*-json.log"

참조. 제프 S.도커: 도커 컨테이너의 로그를 올바르게 지우는 방법은 무엇입니까?

참조:사용 중인 파일 잘라내기(Linux)

Windows 및 Mac용 도커와 다른 도커에서도 테일 옵션을 사용할 수 있습니다.예:

docker logs -f --tail 100

이렇게 하면 마지막 100개 라인만 표시되고 먼저 1M 라인을 스크롤할 필요가 없습니다.

(따라서 로그를 삭제할 필요가 없습니다.)

sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

로그를 정기적으로 지우도록 로그 순환을 설정할 수 있습니다.

/etc/logrotate.d/docker-logs의 파일 예

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}

log-opts "에서 변수를 도 있습니다.docker run다음과 같은 명령줄:

docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest

또는 이런 도커-디버깅.yml에서.

my-app:
image: my-app:latest
logging:
    driver: "json-file"
    options:
        max-size: "10m"
        max-file: "5"

크레딧: https://medium.com/ @Quigley_Ja/회전-도커-로그-오버레이 폴더 보관-small-40cfa2155412 (제임스 퀴글리)

Docker4Mac, 2018년 솔루션:

LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH

첫 번째 줄은 승인된 응답과 유사한 로그 파일 경로를 가져옵니다.

두 번째 줄은 다음을 사용합니다.nsenter 에서명실수 다령을에서 명령을 할 수 .xhyveDocker4Mac에서 모든 Docker 컨테이너의 호스트로 서버를 지정하는 VM입니다.한 우가실는명것익입다니숙입니다.truncate -s0 $LOGPATHMac이 아닌 응답에서.

를 사용하는 docker-compose 번째 다음과 같습니다.

local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))

그리고.<service>는 의서이다니름에 있는 입니다.docker-compose.ymljava.

https://github.com/justincormack/nsenter1 에 감사드립니다.nsenter

도커 명령을 통해 직접 이 작업을 수행할 수 없습니다.

로그 크기를 제한하거나 스크립트를 사용하여 컨테이너와 관련된 로그를 삭제할 수 있습니다.스크립트 예제는 아래에서 확인할 수 있습니다(아래 참조).특징: 로그 내역 #1083 삭제 기능

일부 로깅 드라이버에 대한 옵션(예: 로그 순환 및 로그 크기 제한)을 지정할 수 있는 도커 합성 파일 참조의 로깅 섹션을 확인하십시오.

도커 컨테이너 로그를 삭제하는 크로스 플랫폼 솔루션은 다음과 같습니다.

docker run --rm -v /var/lib/docker:/var/lib/docker alpine sh -c "echo '' > $(docker inspect --format='{{.LogPath}}' CONTAINER_NAME)"

단말기에 붙여넣고 변경합니다.CONTAINER_NAME원하는 컨테이너 이름 또는 ID로 이동합니다.

루트 사용자로서 다음을 실행해 보십시오.

>  /var/lib/docker/containers/*/*-json.log

또는

cat /dev/null > /var/lib/docker/containers/*/*-json.log

또는

echo "" > /var/lib/docker/containers/*/*-json.log

내 Ubuntu 서버에서 나는 심지어 sudo를 얻을 것입니다.Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory

그러나 도커 검사를 빗질하고 답변을 잘라내는 것은 효과가 있었습니다.

sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`

(위의 솔루션에서) 이것을 선호합니다.

truncate -s 0 /var/lib/docker/containers/*/*-json.log

그러나 여러 시스템(예: Ubuntu 18.x Bionic)을 실행하고 있지만 이 경로가 예상대로 작동하지 않습니다.도커는 Snap을 통해 설치되므로 컨테이너 경로는 다음과 같습니다.

truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log

모든 컨테이너에 대한 모든 로그 파일이 삭제됩니다.

sudo find /var/lib/docker/containers/ -type f -name "*.log" -delete

@BMitch의 답변 덕분에 모든 컨테이너의 로그를 정리하는 셸 스크립트를 방금 작성했습니다.

#!/bin/bash
ids=$(docker ps -a --format='{{.ID}}')
for id in $ids
do
        echo $(docker ps -a --format='{{.ID}} ### {{.Names}} ### {{.Image}}' | fgrep $id)
        truncate -s 0 $(docker inspect --format='{{.LogPath}}' $id)
        ls -llh $(docker inspect --format='{{.LogPath}}' $id)
done

이것이 도움이 되는지는 모르겠지만 용기를 제거하는 것이 항상 도움이 됩니다.

만약 한다면, 따서설도컴사경우는에는용하를라를 사용할 수 .docker-compose down && docker-compose up -ddocker-compose restart적절한 설정(영구 데이터에 볼륨 마운트를 사용해야 함)을 사용하면 이러한 방식으로 데이터가 손실되지 않습니다.

물론입니다, 이것은 OP가 요청한 것 이상입니다.그러나 다른 답변으로는 도움이 되지 않는 다양한 상황이 있습니다(원격 도커 서버를 사용하거나 Windows 시스템에서 작업하는 경우 기본 파일 시스템에 액세스하는 것은 독점적이고 어렵습니다).

Linux/Ubuntu:

여러 개의 컨테이너가 있는 경우 로그 하나만 제거하고 다른 로그는 제거하지 않을 경우.

  • ("권한 거부"와 같은 문제가 있는 경우 먼저 수행하십시오.)
  • 용기를 합니다: 모든컨너나열테:docker ps -a
  • 하세요.CONTAINER ID 예:E1X2A3M4P5L6.
  • 이 컨이너폴및실이다깁니다다음보름이보다 .E1X2A3M4P5L6하지만 처음 12개의 캐릭터들은 결과적으로 나온 것들입니다.docker ps -a.
  • 합니다.> /var/lib/docker/containers/E1X2A3M4P5L6*/E1X2A3M4P5L6*-json.log (바꾸기)E1X2A3M4P5L6당신의 결과를 위하여!!)

처럼 다시피 안에 안에./containers이며, 컨이너며이, 로이동만지일하름은이 있습니다.-json.logㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ*의미는 "유연하다"입니다.

다른 답들과 이것을 공유하는 것은 너무 복잡해 보입니다.

관련 컨테이너 로그를 스크랩하는 가장 쉬운 방법은 강제로 다시 생성하는 것입니다.

docker-compose up -d [container] --force-recreate

다음 그때달기리를 실행합니다.docker-compose logs [container]컨테이너가 올라온 이후로 새 항목만 생성됩니다.

하나의 명령어로 실행할 수 있는 무언가가 필요했습니다.docker ps각 컨테이너 ID에 복사하고 명령을 여러 번 실행합니다.저는 Bmitch의 답변을 수정했고 다른 누군가가 이것을 유용하다고 생각할 때를 대비해 공유하려고 생각했습니다.

xargs내가 필요로 하는 일을 해낼 것 같습니다.

docker ps --format='{{.ID}}' | \
  xargs -I {} sh -c 'echo > $(docker inspect --format="{{.LogPath}}" {})'

를이다나에각열된컨너 ID다가로 각가 잡힙니다.docker ps(해당 목록의 모든 컨테이너에 대한 로그를 지웁니다!), 에 파이프 연결합니다.xargs그런 다음 빈 문자열을 반향하여 컨테이너의 로그 경로를 바꿉니다.

Mac 사용자를 위한 도커 솔루션은 다음과 같습니다.

    1. 로그 파일 경로 찾기 방법:

      $ docker inspect | grep log

    1. 머신에 이 SSH라고 합니다).default그렇지 않으면 실행합니다.docker-machine ls확인하기):

      $ docker-machine ssh default

    1. 루트 사용자(참조)로 변경:

      $ sudo -i

    1. 로그 파일 내용 삭제:

      $ echo "" > log_file_path_from_step1

도커 컨테이너 로그를 제거/삭제하려면 아래 명령을 사용합니다.

$(도커 검사 컨테이너_id|grep "LogPath"|cut -d "-f4") 또는 $(도커 검사 컨테이너_name|grep "LogPath"|cut -d "-f4")

로그 파일을 삭제하기 전에 로그 파일의 백업을 저장해야 하는 경우 지정된 컨테이너에 대해 다음 작업을 수행하는 스크립트를 생성했습니다(sudo로 실행해야 함).

  1. 압축된 로그 파일을 백업으로 저장할 폴더를 만듭니다.
  2. 실행 중인 컨테이너의 ID(컨테이너 이름으로 지정)를 찾습니다.
  3. 임의 이름을 사용하여 컨테이너의 로그 파일을 새 위치(1단계의 폴더)에 복사합니다.
  4. 공간 절약을 위해 이전 로그 파일을 압축합니다.
  5. 정의할 수 있는 특정 크기만큼 컨테이너의 로그 파일을 잘라냅니다.

주의:

  • shuf 명령을 사용합니다.Linux 배포 환경에 이 기능이 있는지 확인하거나 다른 bash 지원 임의 생성기로 변경합니다.
  • 사용하기 전에 CONTENTER_NAME 변수를 실행 중인 컨테이너와 일치하도록 변경하십시오. 변수는 부분 이름일 수 있습니다(정확하게 일치하는 이름일 필요는 없습니다).
  • 기본적으로 로그 파일은 10M(10MB)으로 잘라지지만 SIZE_TO_ 변수를 수정하여 이 크기를 변경할 수 있습니다.잘라냅니다.
  • /opt/your-container-name/logs 경로에 폴더를 생성합니다. 압축된 로그를 다른 곳에 저장하려면 LOG_FOLDER 변수를 변경하십시오.
  • 프로덕션에서 실행하기 전에 몇 가지 테스트를 실행합니다.
#!/bin/bash
set -ex

############################# Main Variables Definition:
CONTAINER_NAME="your-container-name"
SIZE_TO_TRUNCATE="10M"

############################# Other Variables Definition:
CURRENT_DATE=$(date "+%d-%b-%Y-%H-%M-%S")
RANDOM_VALUE=$(shuf -i 1-1000000 -n 1)
LOG_FOLDER="/opt/${CONTAINER_NAME}/logs"
CN=$(docker ps --no-trunc -f name=${CONTAINER_NAME} | awk '{print $1}' | tail -n +2)
LOG_DOCKER_FILE="$(docker inspect --format='{{.LogPath}}' ${CN})"
LOG_FILE_NAME="${CURRENT_DATE}-${RANDOM_VALUE}"

############################# Procedure:
mkdir -p "${LOG_FOLDER}"
cp ${LOG_DOCKER_FILE} "${LOG_FOLDER}/${LOG_FILE_NAME}.log"
cd ${LOG_FOLDER}
tar -cvzf "${LOG_FILE_NAME}.tar.gz" "${LOG_FILE_NAME}.log"
rm -rf "${LOG_FILE_NAME}.log"
truncate -s ${SIZE_TO_TRUNCATE} ${LOG_DOCKER_FILE}

매월 이전 스크립트를 실행하는 cron 작업을 생성할 수 있습니다.첫 번째 실행:

sudo crontab -e

키보드에 a를 입력하여 편집 모드로 들어갑니다.그런 다음 다음 행을 추가합니다.

0 0 1 * * /your-script-path/script.sh

이스케이프 키를 눌러 편집 모드를 종료합니다.:wq를 입력하고 Enter 키를 눌러 파일을 저장합니다.스크립트를 확인합니다.sh 파일에 실행 권한이 있습니다.

도커 데스크톱이 있는 컴퓨터에서는 다음을 사용합니다.truncate -s 0 //wsl.localhost/docker-desktop-data/data/docker/containers/*/*-json.log

이할 수 . Linux 배포경다경수있다습니사용할로.truncate -s 0 /var/lib/docker/containers/*/*-json.log

호스트 시스템에서 systemd를 사용하는 경우 journald 로깅 드라이버를 사용하는 것이 좋습니다.

이렇게 하면 회전하지 않는 로컬 파일에 자동으로 로그를 기록하는 대신 중앙 집중식 로그 관리 기능을 사용할 수 있습니다(기본 json-file logging driver는 바로 이러한 방식으로 로그를 기록합니다).저의 경우, 도커 기본값을 사용하면 디스크 공간이 소진됩니다(로그 파일이 7G를 통해 실행됨).

Journald 데몬은 로그를 순환하도록 쉽게 구성할 수 있습니다(문서 참조).

docker system prune
에서 이 합니다.

언급URL : https://stackoverflow.com/questions/42510002/docker-how-to-clear-the-logs-properly-for-a-docker-container

반응형