Program Club

개발중인 Docker 컨테이너에서 코드를 편집하는 방법은 무엇입니까?

proclub 2020. 12. 5. 10:49
반응형

개발중인 Docker 컨테이너에서 코드를 편집하는 방법은 무엇입니까?


/srv내 컨테이너에 내 모든 웹 사이트의 코드가 있습니다.

내 Dockerfile은 git을 사용하여 코드를 다운로드하고 프로덕션에 쉽게 배포 할 수 있도록 이미지의 일부로 만듭니다.

하지만 개발중인 코드를 어떻게 편집합니까? 볼륨을 사용하는 것이 해결책이라고 생각했습니다 -v /docker/mycontainer/srv:/srv. 예 : . 그러나 컨테이너의 디렉토리를 덮어 씁니다. 처음 실행하는 경우 호스트에 아무것도 없기 때문에 비워집니다. 그래서 내가 Dockerfile에서 한 일은 잃어버린 것입니다.

/srv/myapp내 앱의 여러 버전에서 공유하려는 디렉토리와 파일도 있습니다 /srv/myapp/user-uploads. 예 : . 이것은 전문적인 웹 개발 일반적인 관행 입니다.

그래서이 모든 일을 할 수 있도록 무엇을 할 수 있습니까? :

  • 개발중인 / srv에서 코드 편집
  • 다른 버전에서 / srv / myapp / user-uploads 공유
  • Dockerfile이 코드를 다운로드하도록합니다. Docker 외부에서 "git clone"또는 "git pull"을 수행하면 내 생각에 Docker의 목적이 무효화 될 것입니다. 게다가 데이터베이스 마이그레이션이나 기타 앱별 스크립트와 같이 호스트에서 실행할 수없는 것들이 있습니다.

역방향 볼륨 마운트를 수행하는 방법이 있습니까? 내 말은 컨테이너가 그 반대가 아니라 호스트를 덮어 쓰게 만드는 것입니다.

컨테이너의 데몬을 실행하기 전에 / srv를 /srv.deployment-copy에 복사하는 것이 하나의 해결책이라고 생각합니다. 그런 다음 데몬을 실행할 때 /srv.deployment-copy가 있는지 확인하고 모든 것을 / srv에 다시 복사합니다. 이렇게하면 / srv를 볼륨으로 사용하고 Dockerfile을 사용하여 코드를 배포 할 수 있습니다. 이미 모든 도커 명령에 별칭을 사용하고 있으므로 자동화는 문제가되지 않습니다. 어떻게 생각해?


개발에서 코드를 편집하는 가장 좋은 방법은 평소와 같이 모든 것을 설치하고 (앱의 리포지토리 복제 포함) 컨테이너의 모든 코드를 이동하여 /srv/myapp.deploy.dev. 그런 다음에 rw대한 /srv/myapp볼륨과 해당 볼륨을 정리하고 다음과 같이 내부의 새 콘텐츠를 복사하는 init.d 스크립트로 컨테이너를 시작합니다 .

rm -r /srv/myapp/*
rm -r /srv/myapp/.[!.]*
cp -r /srv/myapp.deploy.dev/. /srv/myapp
rm -r /srv/myapp.deploy.dev

다른 컨테이너의 볼륨으로 컨테이너를 시작하는 또 다른 방법이 있습니다.

https://docs.docker.com/userguide/dockervolumes/ 데이터 볼륨 컨테이너 생성 및 마운트참조하십시오.

컨테이너간에 공유하려는 영구 데이터가 있거나 비 영구 컨테이너에서 사용하려는 경우 명명 된 데이터 볼륨 컨테이너를 만든 다음 여기에서 데이터를 탑재하는 것이 가장 좋습니다.

공유 할 볼륨이있는 새 명명 된 컨테이너를 만들어 보겠습니다.

$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

그런 다음 --volumes-from 플래그를 사용하여 / dbdata 볼륨을 다른 컨테이너에 마운트 할 수 있습니다.

$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres

그리고 또 다른:

$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres

볼륨으로 수행 할 수있는 또 다른 유용한 기능은 백업, 복원 또는 마이그레이션에 볼륨을 사용하는 것입니다. --volumes-from 플래그를 사용하여 다음과 같이 해당 볼륨을 마운트하는 새 컨테이너를 만듭니다.

$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

=============

컨테이너에 호스트 디렉토리를 마운트하지 말아야한다고 생각합니다. 그러나 모든 힘을 가진 볼륨을 사용할 수 있습니다. 완벽한 편집기 및 도구 세트가있는 다른 컨테이너를 사용하여 볼륨의 파일을 편집 할 수 있습니다. 그리고 당신의 앱은 오버 헤드없이 깨끗해질 것입니다.

구조
:-) 앱 데이터 용 컨테이너
docker run -d -v /data --name data
-) 앱 바이너리
docker run -d --volumes-from data --name app1
용 컨테이너-) 개발 용 편집기 및 유틸리티 용 컨테이너
docker run -d --volumes-from data --name editor


참고 : 당신이 할 수없는 마운트 와 호스트 디렉토리에 컨테이너 디렉토리 -v.

/ srv 및 /srv.deployment-copy를 조작 할 필요가 없다고 생각합니다. 만약 너라면

내 생각에는:

  • 영구 / 공유 데이터에 볼륨을 사용해야합니다. -v /hostdir/user-uploads:/srv/myapp/user-uploads또는 데이터 볼륨 컨테이너 개념을 사용할 수 있습니다 . 이것을 호스트 (데이터 전용 컨테이너)에 저장되고 컨테이너가에서 사용할 수 있는 파일 시스템 백업 데이터베이스 라고 생각할 수 있습니다 -v.

  • 맞습니다. 프로덕션 배포의 경우 소스 코드 ( git clone)로 이미지를 빌드 할 수 있으며 모든 릴리스에 대한 이미지를 빌드합니다. 프로덕션에서 소스 코드를 편집 할 필요가 없습니다.

  • 에 대한 개발 환경 - 당신은 소스 코드없이 이미지를 구축해야하거나 배포 / 개발에 동일한 이미지를 사용하는 경우 볼륨과 소스 코드 디렉토리를 그림자 수 있습니다. 그런 다음 소스 코드를 로컬로 복제하고 볼륨 -v /hostdir/project/src:/srv/project사용 하여 소스 코드를 컨테이너와 공유하십시오. 가급적이면 소스 코드를 읽기 전용으로 공유하고 ( :ro끝에) 임시 또는 중간 파일은 컨테이너의 다른 곳에 저장해야합니다. 서비스 시작 전에 컨테이너 시작시 실행되는 설정 스크립트 (데이터 마이그레이션, 일부 인덱스 / 캐시 데이터 파일 다시 작성 등)가 있습니다. 그래서 fresh가 필요하다고 느낄 때마다 re-initdev 컨테이너를 죽이고 다시 실행합니다. 또는 이전 컨테이너를 중지하지 않고 다른 컨테이너를 실행합니다.


git을 사용하여이 작업을 수행하는 좋은 방법을 찾았습니다.

CONTAINER=my_container
SYNC_REPO=/tmp/my.git
CODE=/var/www

#create bare repo in container
docker exec $CONTAINER git init --bare $SYNC_REPO

#add executable syncing hook that checks out into code dir in container
printf "#!/bin/sh\nGIT_WORK_TREE=$CODE git checkout -f\n" | \
docker exec -i $CONTAINER bash -c "tee $SYNC_REPO/hooks/post-receive;chmod +x \$_"

#use git-remote-helper to use docker exec instead of ssh for git
git remote add docker "ext::docker exec -i $CONTAINER sh -c %S% $SYNC_REPO"

#push updated local code into docker
git push docker master

Assumes you have a local git with the code. Git needs to be installed in container. Alternatively you could probably use docker run and a data container with a shared volume with git installed.


Assuming git is not the entrypoint of the container, if git is installed in your docker container you can ssh into the container and run the git clone/git pull. Because of the way the volume is shared with the host, changes made from the container to the files will be made to the host as well (really it's the same files).

Here is some explanation of how to quickly ssh into a container.

참고URL : https://stackoverflow.com/questions/22842920/how-to-edit-code-in-a-docker-container-in-development

반응형