[bash] Docker 컨테이너를 중지 / 시작하지 않는 파일을 편집하는 방법
여러 컨테이너로 분할 된 내 애플리케이션의 오류를 수정하고 문제를 디버깅하려고 시도하면서 컨테이너의 파일을 자주 편집합니다.
-
나는 완전히 게으르고 nano를 설치하고 컨테이너에서 직접 편집하거나
-
컨테이너에서 파일을 Docker cp, 편집, 다시 복사하고 컨테이너를 다시 시작합니다.
이는 컨테이너 빌드를위한 새로운 콘텐츠를 만들기 전의 중간 단계이며, 위의 작업을 수행하는 것보다 훨씬 오래 걸립니다 (물론 중급 / 조작에 불과합니다).
이제는 컨테이너의 시작 프로그램을 자주 중단합니다. 중단되는 경우에는 노드 스크립트 또는 Python 웹 서버 스크립트가 일반적으로 구문 오류로 인해 실패합니다.
컨테이너를 저장할 방법이 있습니까? 그들이 시작하지 않기 때문에 나는 그들에게 docker exec를 할 수 없으므로 그들은 나에게 잃어 버렸습니다. 그런 다음 빌드 입력에서 문제가되는 파일을 수정 한 후 rm / rmi / build / run 경로로 이동합니다.
중지 된 컨테이너에서 파일을 편집하거나 중지 된 컨테이너에서 cp 또는 셸을 시작하려면 어떻게해야합니까?이 컨테이너를 수정할 수있는 모든 것이 있습니까?
(원격 컴퓨터에서 작업하고 네트워킹 구성을 깨는 것과 비슷해 보입니다. 연결이 “영원히”끊어지고있는 경우 폴백을 사용해야합니다.)
호스트에서 Docker 컨테이너 파일을 편집하는 방법은 무엇입니까? 관련성이 있지만 구식입니다.
답변
잘못된 구성 변경으로 인해 시작되지 않는 컨테이너에 문제가 있습니다. 중지 된 컨테이너에서 파일을 복사하여 편집 할 수있었습니다. 다음과 같이 :
docker cp docker_web_1:/etc/apache2/sites-enabled/apache2.conf .
(파일 수정)
docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf
답변
내 자신의 질문에 답하고 .. 더 많은 지식을 가진 사람으로부터 더 나은 답을 기대하고 있습니다 !!
두 가지 가능성이 있습니다.
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는 컨테이너 외부에서 편집 된 파일을 복사하는 데 유용합니다.
또한 컨테이너가 다소 “분실”된 경우에만 해당 조치로 돌아 가야하므로 변경 사항이 개선 될 것입니다.
답변
컨테이너 파일 시스템을 직접 편집 할 수 있지만 좋은 생각인지 모르겠습니다. 먼저 컨테이너의 런타임 루트로 사용되는 디렉토리 경로를 찾아야합니다. 을 실행 docker container inspect id/name
합니다. UpperDir
JSON 출력 에서 키 를 찾습니다 .
그것이 당신의 디렉토리입니다.
답변
중지 된 컨테이너를 다시 시작하려고하는데 잘못된 구성으로 인해 컨테이너를 변경해야하지만 컨테이너가 시작되지 않는 경우 “docker cp”명령을 사용하여 작동하는 다음을 수행 할 수 있습니다 (이전 제안과 유사). 이 절차를 통해 파일을 제거하고 필요한 다른 변경을 수행 할 수 있습니다. 운 좋게도 아래의 많은 단계를 건너 뛸 수 있습니다.
- Docker inspect를 사용하여 진입 점 찾기 (일부 버전에서는 Path라고 함)
- Docker 실행을 사용하여 복제본 만들기
- docker exec -ti bash를 사용하여 clone을 입력하십시오 (* nix 컨테이너 인 경우).
- 찾을 클론을 통해 진입 점 파일 위치를 찾습니다.
- docker cp : ./를 사용하여 이전 진입 점 스크립트를 복사합니다.
-
예를 들어 새로운 진입 점 스크립트 수정 또는 생성
#!/bin/bash
tail -f /etc/hosts - 스크립트에 실행 권한이 있는지 확인
- docker cp ./ 사용하여 이전 진입 점을 바꿉니다.
- start를 사용하여 이전 컨테이너 시작
- 시작될 때까지 6-9 단계를 다시 실행하십시오.
- 컨테이너의 문제 해결
- 필요한 경우 진입 점을 복원하고 필요에 따라 6-9 단계를 다시 실행합니다.
- 필요한 경우 클론 제거