Docker 컨테이너에 셸한 후 파일을 어떻게 편집합니까?


518

다음을 사용하여 Docker 컨테이너에 성공적으로 쉘했습니다.

docker exec -i -t 69f1711a205e bash

이제 파일을 편집해야하며 안에 편집기가 없습니다.

root@69f1711a205e:/# nano
bash: nano: command not found
root@69f1711a205e:/# pico
bash: pico: command not found
root@69f1711a205e:/# vi
bash: vi: command not found
root@69f1711a205e:/# vim
bash: vim: command not found
root@69f1711a205e:/# emacs
bash: emacs: command not found
root@69f1711a205e:/#

파일은 어떻게 편집합니까?


@Opal I 이용 합류 / 포스트 그레스-BW : 0.1
이고르 Barinov

2
@Opal apt-get install vim이 작동합니다. 감사!
Igor Barinov 2016 년

3
그렇다면 Dockerfileapt-get install 명령을 작성하고 자신의 컨테이너를 생성하십시오. Docker 컨테이너는 사용자의 방식이 아닌 이와 같이 설계되었습니다.
BMW

1
고정 표시기는 적어도 정력에 기본적으로 테스트 편집기에 임대에 설치해야합니다
Bawantha

답변:


723

주석에서와 같이 기본 편집기 세트가 없습니다-이상합니다- $EDITOR환경 변수가 비어 있습니다. 다음을 사용하여 컨테이너에 로그인 할 수 있습니다.

docker exec -it <container> bash

그리고 다음을 실행하십시오.

apt-get update
apt-get install vim

또는 다음 Dockerfile을 사용하십시오.

FROM  confluent/postgres-bw:0.1

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]

Docker 이미지는 최소한으로 트리밍되어 제공되므로 배송 된 컨테이너에 편집기가 설치되어 있지 않습니다. 그렇기 때문에 수동으로 설치해야합니다.

편집하다

또한 주제에 대한 내 게시물 을 읽는 것이 좋습니다 .


3
필요한 것은 볼륨을 마운트하는 것입니다 : docs.docker.com/userguide/dockervolumes
Opal

16
이 작업을 수행하려면 루트로 로그인해야했습니다 docker exec -u 0 -it container_name bash.
Eng.Fouad

34
docker와 마찬가지로 vim-tiny대신 설치 하는 것이 좋습니다 .
ryenus

2
어쩌면 첨부 한 각 컨테이너에 편집기를 설치하지 않고 도커 호스트 시스템에 한 번만 설치할 수 있습니다. 다른 주석가가 언급했듯이 볼륨을 마운트 할 수 있으므로 마운트 할 파일을 편집하거나 컨테이너 데이터 자체를 탐색하고 파일을 편집 할 수 있습니다./var/lib/docker/
Pitt

4
컨테이너에서 하나의 구성을 true에서 false로 변경하고 싶었습니다. apt-get컨테이너 내부의 권한 문제로 인해 작동하지 않았으므로 시도했습니다 sed -i 's/texttobechanged/textwanted/g' filename. 그것은 나를 위해 일했다.
Amreesh Tyagi

420

몇 가지 작은 변경 (예 : Tomcat 구성 변경)을 수행하기 위해 편집기를 추가하지 않으려면 다음을 사용하십시오.

docker cp <container>:/path/to/file.ext .

로컬 컴퓨터 (현재 디렉토리)로 복사합니다. 그런 다음 즐겨 사용하는 편집기를 사용하여 파일을 로컬로 편집 한 다음

docker cp file.ext <container>:/path/to/file.ext

이전 파일을 대체하십시오.


21
@Igor 컨테이너에 패키지를 추가하지 않고 적절한 방법이므로 패키지를 추가하는 것이 보조 솔루션이어야하므로 실제로 허용되는 솔루션이어야합니다.
Routhinator

1
Windows 플랫폼의 경우, 예를 들어, 사용할 수 있습니다 docker cp <container>:C:\inetpub\wwwroot\Web.config .docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config.
Rosberg Linhares

1
테스트 목적으로 좋은 해결 방법! 프로덕션 환경에서는 권장하지 않습니다.
Michal Šípek

9
그리고 생산을 위해 무엇을 추천합니까? 사람들이 프로덕션 환경에서 컨테이너의 파일을 대화식으로 편집해야합니까?
lucid_dreamer 2018 년

4
이 방법에 주목하면 파일 소유권이 변경됩니다. 컨테이너에 루트 ( docker exec -u 0 -it mycontainer bash)로 이동 한 다음 chown명령 을 실행하여 나중에 다시 변경하는 것이 가능하지만 약간 어리 석습니다 .
Steve Chambers

91

cat설치된 경우 사용할 수 있으며 베어 / 원시 컨테이너가 아닌 경우에 해당됩니다. 그것은 꼬집음으로 작동하며 로컬로 적절한 편집기에 복사하여 붙여 넣을 때 좋습니다.

cat > file
# 1. type in your content
# 2. leave a newline at end of file
# 3. ctrl-c / (better: ctrl-d)
cat file

cat줄 바꿈을 수신하면 각 줄을 출력합니다. 마지막 줄에 줄 바꿈을 추가하십시오. ctrl-c는 SIGINT고양이가 정상적으로 종료되도록 for를 보냅니다 . 주석에서 ctrl-d를 눌러 파일 끝을 표시 할 수 있습니다 ( "입력이 더 이상 없음").

또 다른 옵션은 infilterptrace를 사용하여 프로세스를 컨테이너 네임 스페이스에 주입하는 것과 같은 것 입니다 : https://github.com/yadutaf/infilter


3
주입 권한 문제가있는 경우 매우 유용합니다!
로마

17
ctrl+D보다 낫다 ctrl+C. ctrl+D을 보냅니다 EOF. 끝에 줄 바꿈을 추가하지 않아도됩니다. 로 ctrl+C줄 바꿈을 추가하지 않으면 마지막 줄을 잃게됩니다!
wisbucky 2016 년

1
트윗 담아 가기 더 좋습니다. 그래도 Ctrl-D를 두 번 눌러야 할 수도 있습니다.
meijsermans 2016 년

52

Docker 이미지를 작게 유지하려면 불필요한 편집기를 설치하지 마십시오. Docker 호스트에서 컨테이너로 SSH를 통해 파일을 편집 할 수 있습니다.

vim scp://remoteuser@containerip//path/to/document

2
감사합니다. vim scp:// vim.wikia 보다 잘 설명하는이 링크를 남기고 싶었 습니다 . 또한 컨테이너의 IP 주소를 얻으려면 다음을 사용할 수 있습니다.sudo docker inspect <container_id> | grep "IPAddress"
aJetHorn

1
문자 그대로 "원격 사용자"또는 "도커"를 사용합니까? : 나는 해봤 vim scp://docker@172.17.0.17//data/gitea/conf/app.ini뿐만 아니라 vim scp://remoteuser@172.17.0.17//data/gitea/conf/app.ini그들 모두는 비어있는 새 파일을 만듭니다.
J. Scott Elblein

1
@ J.ScottElblein ssh먼저 도커 컨테이너에서 구성해야합니다 . blog.softwaremill.com/…을 참조하십시오 . 그러나 일반적으로 ssh컨테이너에 설치하고 싶지 않습니다 .
wisbucky

14

때로는 먼저 다음을 사용하여 컨테이너를 실행해야합니다 root.

docker exec -ti --user root <container-id> /bin/bash

그런 다음 컨테이너에서 Vim 또는 다른 것을 설치하십시오.

apt-get install vim

7

"docker exec"가 아닌 "docker run"을 사용하고 편집기를 설치할 수없는 제한된 영역에 있습니다. 하지만 Docker 호스트에 편집자가 있습니다.

해결 방법은 Docker 호스트에서 컨테이너 ( https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems )에 볼륨을 바인딩하고 컨테이너 외부에서 파일을 편집하십시오. 다음과 같이 보입니다 :

docker run -v /outside/dir:/container/dir

이것은 주로 실험용이며 나중에 이미지를 만들 때 파일을 변경합니다.


6

Docker 컨테이너에 셸한 후 다음을 입력하십시오.

apt-get update
apt-get install nano

6

당신은 기존 파일을 열 수 있습니다

cat filename.extension

클립 보드에 모든 기존 텍스트를 복사합니다.

그런 다음 이전 파일을 삭제하십시오.

rm filename.extension

또는 기존 파일의 이름을

mv old-filename.extension new-filename.extension

로 새 파일 만들기

cat > new-file.extension

그런 다음 클립 보드에 복사 된 모든 텍스트를 붙여넣고을 Enter눌러 저장하고 종료 ctrl+z합니다. 그리고 voila는 어떤 종류의 편집기도 설치할 필요가 없습니다.


5

호스트에서 파일을 편집하고 신속하게 파일을 복사하여 컨테이너 내에서 실행할 수 있습니다. 다음은 파이썬 파일을 복사하고 실행하는 한 줄 단축키입니다.

docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py

1
그 질문에 어떻게 대답합니까? - "파일은 어떻게 편집합니까?"
피터 Mortensen

4

일반적인 편집 작업의 I 설치하는 것을 선호 vi( VIM-작은 ) 만 사용 1,491 킬로바이트 또는 nano사용 1,707 킬로바이트를 .

반면에 28.9MB를vim 사용합니다. .

우리는 apt-get install일 하기 위해서는 update처음으로 해야한다는 것을 기억 해야합니다 .

apt-get update
apt-get install vim-tiny

CLI 에서 편집기를 시작하려면 을 입력해야합니다 vi.


2

Windows 컨테이너를 사용하고 파일을 변경하려는 경우 Powershell 콘솔에서 Vim을 쉽게 가져와 사용할 수 있습니다.

PowerShell을 사용하여 Windows Docker 컨테이너에 셸하려면

docker exec -it <name> powershell

  • Chocolatey 패키지 관리자를 먼저 설치하십시오.

    Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression;

  • Vim 설치

    choco install vim

  • 환경 변수 새로 고침 exit컨테이너에 다시 셸을 넣을 수 있습니다.

  • 파일 위치로 이동하여 Vim it vim file.txt


1

그것은 다소 까다 롭지 만, 꼬집음으로 텍스트를 사용 sed하거나 awk약간 편집하거나 제거 할 수 있습니다 . 물론 정규 표현식 대상에주의하고 root컨테이너에 있을 가능성 이 있으며 권한을 다시 조정해야 할 수도 있습니다.

예를 들어 정규 표현식과 일치하는 텍스트가 포함 된 전체 줄을 제거합니다.

awk '!/targetText/' file.txt > temp && mv temp file.txt

(더)


1

몇 줄을 편집하는 쉬운 방법은 다음과 같습니다.

echo "deb http://deb.debian.org/debian stretch main" > sources.list

1

스택 오버 플로우 질문 sed 편집 파일을 참조하십시오.

다음과 같은 경우에 좋은 옵션이 될 것입니다.

  1. 큰 파일을 수정하기 위해는 사용할 수 없습니다 cat.
  2. Vim 설치가 허용되지 않거나 시간이 오래 걸립니다. 나는 변경하고자 할 때 내 상황이 MySQL을 5.7 이미지를 사용하고 my.cnf파일을이 아니요 vim, vi너무 오래 (만리 방화벽) 및 빔 설치합니다. sed이미지에 제공되며 매우 간단합니다. 내 사용법은

    sed -i /s/testtobechanged/textwanted/g filename

    man sed보다 복잡한 사용법을 위해 다른 자습서를 사용 하거나 찾으십시오.


1

caracter cat와 함께 설치된 경우 사용할 수 있습니다 >. 조작은 다음과 같습니다.

cat > file_to_edit
#1 Write or Paste you text
#2 don't forget to leave a blank line at the end of file
#3 Ctrl + C to apply configuration

이제 명령으로 결과를 볼 수 있습니다

cat file

0

필요한 명령 만 포함하는 특수 컨테이너를 사용할 수도 있습니다. Vim. python-vim을 선택했습니다 . 편집하려는 데이터가 다음 Dockerfile로 빌드 된 데이터 컨테이너에 있다고 가정합니다.

FROM debian:jessie
ENV MY_USER_PASS my_user_pass
RUN groupadd --gid 1001 my_user
RUN useradd -ms /bin/bash --home /home/my_user \
            -p $(echo "print crypt("${MY_USER_PASS:-password}", "salt")" | perl) \
            --uid 1001 --gid 1001 my_user
ADD src /home/my_user/src
RUN chown -R my_user:my_user /home/my_user/src
RUN chmod u+x /home/my_user/src
CMD ["true"]

데이터 컨테이너 (src_data)와 python-vim 컨테이너가 공유 할 Docker 볼륨 (src_volume)을 마운트하여 데이터를 편집 할 수 있습니다.

docker volume create --name src_volume
docker build -t src_data .
docker run -d -v src_volume:/home/my_user/src --name src_data_1 src_data
docker run --rm -it -v src_volume:/src fedeg/python-vim:latest

이렇게하면 컨테이너를 변경하지 않습니다. 이 작업을 위해 특수 컨테이너를 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.