Docker 컨테이너를 중지 / 시작하지 않는 파일을 편집하는 방법


94

여러 컨테이너로 분할 된 내 애플리케이션의 오류를 수정하고 문제를 디버깅하려고 시도하면서 컨테이너의 파일을 자주 편집합니다.

  • 나는 완전히 게으르고 nano를 설치하고 컨테이너에서 직접 편집하거나

  • 컨테이너에서 파일을 Docker cp, 편집, 다시 복사하고 컨테이너를 다시 시작합니다.

이는 컨테이너 빌드를위한 새로운 콘텐츠를 만들기 전의 중간 단계이며, 위의 작업을 수행하는 것보다 훨씬 오래 걸립니다 (물론 중급 / 조작에 불과합니다).

이제는 컨테이너의 시작 프로그램을 자주 중단합니다. 중단되는 경우에는 노드 스크립트 또는 Python 웹 서버 스크립트가 일반적으로 구문 오류로 인해 실패합니다.

컨테이너를 저장할 방법이 있습니까? 그들이 시작하지 않기 때문에 나는 그들에게 docker exec를 할 수 없으므로 그들은 나에게 잃어 버렸습니다. 그런 다음 빌드 입력에서 문제가되는 파일을 수정 한 후 rm / rmi / build / run 경로로 이동합니다.

중지 된 컨테이너에서 파일을 편집하거나 중지 된 컨테이너에서 cp 또는 셸을 시작하려면 어떻게해야합니까?이 컨테이너를 수정할 수있는 모든 것이 있습니까?

(원격 컴퓨터에서 작업하고 네트워킹 구성을 깨는 것과 비슷해 보입니다. 연결이 "영원히"끊어지고있는 경우 폴백을 사용해야합니다.)

호스트에서 Docker 컨테이너 파일을 편집하는 방법은 무엇입니까? 관련성이 있지만 구식입니다.


이것은 또한 해결 방법이 될 수 있습니다. stackoverflow.com/a/32353134/586754- 아직 더 나은 솔루션을 기대합니다.
Andreas Reiff 2015 년

1
컨테이너 내부가 아닌 호스트에서 파일을 편집 할 수 있도록 볼륨 마운트를 고려해야 할 수도 있습니다. 코드에 만족하면, 당신은 무료이다 docker cp(또는 새로운 이미지를 구축) 컨테이너에 파일
Thomasleveil

네, 처음부터 이렇게 설정하지 않았다면 조금 늦었을 것입니다. 이것은 회복에 효과가 없다고 생각합니다.
Andreas Reiff 2015 년

많은 독자들은 파일을 편집하기보다는 보기 만 원할 것입니다. 이러한 경우 docker commit명령을 사용하여 새 이미지를 끊을 수 있습니다 . name=$(docker commit); docker run -it $name /bin/sh당신이 원하는 것을 할 것입니다.
Att Righ

그래서 중지 된 컨테이너의 파일 시스템은 결국 상대적으로 영구적 인 것 같습니다.
Webwoman

답변:


139

잘못된 구성 변경으로 인해 시작되지 않는 컨테이너에 문제가 있습니다. 중지 된 컨테이너에서 파일을 복사하여 편집 할 수있었습니다. 다음과 같이 :

docker cp docker_web_1:/etc/apache2/sites-enabled/apache2.conf .

(파일 수정)

docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf

22
이것은 받아 들여지는 대답이어야한다. 어떤 이유로 CP가 정지 된 컨테이너에서 작동한다고 생각하지 않았습니다. 좋은!
Proximo

완전한. 컨테이너에서 파일을 복사 한 다음 (경로를 알고 있음) 편집 한 다음 동일한 위치의 컨테이너로 다시 복사했습니다. 나를 위해 일했습니다! 감사!
Nawaz

파일을 제거하는 방법이 있습니까?
kodlan

1
@kodlan UpperDir당신이 가져온 파일 에만 나타나는 경우에만 docker container inspect-오버레이 시스템이 상위 레이어에서 삭제 된 기본 구조의 파일을 어떻게 나타내는 지 실험해야합니다.
Tim Baverstock

감사합니다. 이것은 macOS의 도커에서 실행되는 MySQL 컨테이너를 수정하는 데 도움이되었습니다.
mazedlx

60

내 자신의 질문에 답하고 .. 더 많은 지식을 가진 사람으로부터 더 나은 답을 기대하고 있습니다 !!

두 가지 가능성이 있습니다.

1) 호스트에서 직접 파일 시스템 편집 . 이것은 다소 위험하며 컨테이너를 완전히 깨뜨릴 가능성이 있으며, 잘못된 것에 따라 다른 데이터가있을 수 있습니다.

2) 시작 스크립트 를 bash 시작, 수정 / 편집을 수행 한 다음 시작 프로그램을 원하는 것으로 다시 변경하는 것과 같이 실패하지 않는 것으로 변경합니다 (예 : 노드 또는 이전에 있었던 것).

자세한 내용은:

1) 사용

docker ps

실행중인 컨테이너를 찾거나

docker ps -a

모든 컨테이너 (중지 된 컨테이너 포함)를 찾고

docker inspect (containername)

첫 번째 값 중 하나 인 "Id"를 찾으십시오.

이것은 구현 세부 사항을 포함하고 변경 될 수있는 부분입니다. 이런 식으로 컨테이너를 잃을 수 있습니다.

이동

/var/lib/docker/aufs/diff/9bc343a9..(long container id)/

컨테이너가 기반으로하는 이미지쪽으로 변경된 모든 파일을 찾을 수 있습니다. 파일을 덮어 쓰거나 파일을 추가 또는 편집 할 수 있습니다.

다시 말하지만 나는 이것을 권장하지 않습니다.

2) https://stackoverflow.com/a/32353134/586754에 설명 된대로 다음 과 같은 경로에서 구성 json config.json을 찾을 수 있습니다.

/var/lib/docker/containers/9bc343a99..(long container id)/config.json

여기에서 "nodejs app.js"에서 "/ bin / bash"로 인수를 변경할 수 있습니다. 이제 docker 서비스를 다시 시작하고 컨테이너를 시작합니다 (이제 올바르게 시작되는지 확인해야 함). 당신은 사용해야합니다

docker start -i (containername)

즉시 종료되지 않도록합니다. 이제 컨테이너로 작업하거나 나중에 연결할 수 있습니다.

docker exec -ti (containername) /bin/bash

또한 docker cp는 컨테이너 외부에서 편집 된 파일을 복사하는 데 유용합니다.

또한 컨테이너가 다소 "분실"된 경우에만 해당 조치로 돌아 가야하므로 변경 사항이 개선 될 것입니다.


여전히 더 나은 답변을 기대하고 있습니다. 자유롭게 답변 해 주시면 "ansered"태그도 옮길 것입니다.
Andreas Reiff 2011

나는 두 번째 방법을 사용하고 난의 덮어 쓰기를 강제하기 위해 고정 표시기 서비스를 다시 시작했다 config.json파일 내가 그들을 편집 할 때마다
비탈리 Isaev을

2
config.v2.json이 있고 좀비 컨테이너를 시작할 때마다 Path / EntryPoint 업데이트를 되돌리고 다시 한 번 죽습니다. "docker cp"를 사용하여 bash를 실행하기 위해 entrypoint.sh 스크립트를 업데이트하여 문제를 해결했습니다.
Curtis Yallop 2017

@CurtisYallop 저도 같은 일을 겪고 있습니다. 어떻게 해결 했습니까?
Brett McLain

1
@BrettMcLain 호스트에서 편집하는 대신 docker cp를 사용했습니다. 다음과 같이 : 진입 점 스크립트 위치 찾기 : "docker inspect container_name | grep Entry". 스크립트 가져 오기 : "docker cp container_name : /entrypoint.sh ./". (편집) 스크립트를 컨테이너에 다시 넣습니다 : "docker cp entrypoint.sh container_name : /entrypoint.sh". 진입 점에서 bash를 실행하거나 수면 루프를 실행할 수 있습니다 (예 : "while :; do sleep 10; done"). 첫 번째 스크립트 줄은 "#! / bin / bash"여야합니다.
Curtis Yallop

9

컨테이너 파일 시스템을 직접 편집 할 수 있지만 좋은 생각인지 모르겠습니다. 먼저 컨테이너의 런타임 루트로 사용되는 디렉토리 경로를 찾아야합니다. 을 실행 docker container inspect id/name합니다. UpperDirJSON 출력 에서 키 를 찾습니다 .

그것이 당신의 디렉토리입니다.


디렉토리를 찾았지만 모든 파일이 포함되지 않았습니다.
aioobe

OverlayFS이므로 파일이 해당 디렉토리에 있어야합니다.
Tejas Sarade 2018

디렉토리 이름은 "UpperDir"과 다를 수 있습니다. 예를 들어 제 경우에는 Source입니다. 하지만 효과가있었습니다!
Rajni Kewlani

0

중지 된 컨테이너를 다시 시작하려고하는데 잘못된 구성으로 인해 컨테이너를 변경해야하지만 컨테이너가 시작되지 않는 경우 "docker cp"명령을 사용하여 작동하는 다음을 수행 할 수 있습니다 (이전 제안과 유사). 이 절차를 통해 파일을 제거하고 필요한 다른 변경을 수행 할 수 있습니다. 운 좋게도 아래의 많은 단계를 건너 뛸 수 있습니다.

  1. Docker inspect를 사용하여 진입 점 찾기 (일부 버전에서는 Path라고 함)
  2. Docker 실행을 사용하여 복제본 만들기
  3. docker exec -ti bash를 사용하여 clone을 입력하십시오 (* nix 컨테이너 인 경우).
  4. 찾을 클론을 통해 진입 점 파일 위치를 찾습니다.
  5. docker cp : ./를 사용하여 이전 진입 점 스크립트를 복사합니다.
  6. 예를 들어 새로운 진입 점 스크립트 수정 또는 생성

    #!/bin/bash tail -f /etc/hosts

  7. 스크립트에 실행 권한이 있는지 확인
  8. docker cp ./ 사용하여 이전 진입 점을 바꿉니다.
  9. start를 사용하여 이전 컨테이너 시작
  10. 시작될 때까지 6-9 단계를 다시 실행하십시오.
  11. 컨테이너의 문제 해결
  12. 필요한 경우 진입 점을 복원하고 필요에 따라 6-9 단계를 다시 실행합니다.
  13. 필요한 경우 클론 제거
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.