심볼릭 링크 된 폴더를 일반 폴더로 표시하는 방법


38

도 커화해야하는 두 개의 Dart 애플리케이션이 있습니다. 이 두 앱은 공유 소스 디렉토리를 사용합니다.
부두 노동자의 방지 컨텍스트 디렉토리 외부 폴더에서 파일을 추가하기 때문에 ( project/app1) 나는 파일을 추가 할 수 ../shared없으며에서 shared(심볼릭 링크의 내부 projects/app1).

어쨌든 Docker가 속일 수있는 방법을 찾고 있습니다.

단순화 된 프로젝트 구조

- projects
  - app1
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - app2
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - shared
    - source

Dockerfile한 레벨 위로 이동 docker build하여 거기에서 실행할 수 있지만 동일한 디렉토리에 두 개의 Dockerfile (app1 및 app2 용)이 필요합니다.

내 현재 아이디어는 어떻게 든 projects/app1/shared심볼릭 링크 라는 사실을 숨길 수 있다면 이 문제가 해결 될 것입니다. projectsSamba를 사용하여 공유 하고 다른 위치에 다시 마운트 할 수 있는지 확인 하고 일반 폴더와 같은 심볼릭 링크를 처리하도록 Samba를 구성했지만 이것이 지원되는지 여부를 찾지 못했습니다 (Samba에 대한 경험이 많지 않고 아직 시도하지 않았지만 조금 검색했습니다) .

그것을 허용 할 다른 도구 나 트릭이 있습니까?

다른 문제가 발생하고 파일을 복사하지 않기 때문에 디렉토리 구조를 변경하지 마십시오.

답변:


35

나는 경험이 많지 docker않기 때문에 이것이 효과가 있다고 약속 할 수는 없지만 한 가지 선택은 링크하는 대신 디렉토리를 마운트하는 것입니다.

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/

이는 시스템에 부착 ../shared되며 ./shared시스템에 완전히 투명해야합니다. 에 설명 된대로 man mount:

바인드가 마운트됩니다.

Linux 2.4.0부터는 파일 계층의 일부를 다른 곳에 다시 마운트 할 수 있습니다. 전화는 :

mount --bind olddir newdir

또는이 fstab 항목을 사용하여 :

/olddir /newdir none bind

이 호출 후 동일한 컨텐츠에 두 곳에서 액세스 할 수 있습니다.


1
@zoechi 이것은 두 사이트 모두에서 주제에 완벽하게 적용됩니다. 일반적으로 U & L에 대한 이와 같은 기술적 인 질문과 여기에 더 많은 사용자 공간 질문을 게시 할 것입니다. 선택은 전적으로 당신에게 달려 있습니다. 한편으로는 여기에 더 많은 사용자가 있으므로 더 많은 안구가 있고 다른 한편으로 U & L에는 전문 * nix 인력이 훨씬 더 많이 있습니다. 두 사이트에 동일한 질문을 게시하지 마십시오. 이동하려면이 항목을 삭제하거나 모드주의를 표시하고 마이그레이션을 요청하십시오.
terdon

2
docker daemon을 다시 시작해야했습니다! 그렇지 않으면 마운트 된 디렉토리가 컨테이너에 표시되지 않았습니다.
dim

@dim 네! Capistrano와 함께 작동 시키려고했지만 작동하지 않았습니다. – 컨테이너를 시작한 공유 디렉토리를 마운트했습니다
csch

불행히도 이것은 Windows 또는 OS X 사용자에게는 작동하지 않습니다. 이 문제에 대한 토론은 활발했습니다.
Jason

소스 제어에 '커밋 된'마운트입니까? 예 : github? 아니면 매번해야합니까?
pie6k

23

이 문제는 Docker 커뮤니티에서 반복적으로 발생했습니다. 기본적으로 Dockerfile실행하거나 반복하면 반복 가능 해야한다는 요구 사항을 위반 합니다. 따라서이 티켓에 설명 된 것처럼이 기능을 기대 하지 않습니다 .Dockerfile ADD 명령은 호스트 # 1676의 심볼릭 링크를 따르지 않습니다 .

따라서 다른 접근 방식을 고려해야합니다. 이 문제를 살펴보면 : 인수 # 6094에서 심볼릭 링크를 지원하기 위해 ADD를 수행하면 U & L ( @Patrick aka. phemmer) 의 친구가 영리한 해결 방법을 제공합니다.

$ tar -czh . | docker build -

이 이야기 tar받는 사람 모두 현재 디렉토리에서 심볼릭 링크, 다음 파이프를 역 참조하는 docker build -명령.

타르 맨 페이지에서 발췌
-c, --create
       create a new archive

-h, --dereference
       follow symlinks; archive and dump the files they point to

-z, --gzip, --gunzip --ungzip

3
이것은 탁월한 솔루션입니다! Docker가 왜이 기능을 생략하고 싶다고 주장하는지 이해합니다. 그러나 컨테이너화 프로젝트를 개발할 때 사용하는 워크 플로와 프로덕션을 위해 빌드되는 방식에는 상당한 차이가 있습니다. 내 로컬 컴퓨터에서 매우 엄격한 피드백 루프를 원합니다. 내 앱에는 1 git repo가 ​​있고 컨테이너의 빌드 환경에는 2 번째 repo가 ​​있습니다. 커밋하고 푸시할지 결정하기 전에 로컬에서 편집하고 테스트를 빌드 할 수 있어야합니다. 최종 프로젝트에 심볼릭 링크 또는 ADD 지침이 없습니다.
Bruno Bronosky

6
Dockerfile은 반복 할 수 없습니다. Dockerfile은 거의 모두 2 층 또는 3 층에서 apt-get 또는 동등한 것을 가지고 있으며 apt-get은 반복 할 수 없기 때문에 반복 가능하게 만들 수 없습니다. Docker 개발 전략을 불가능한 사실로 만들기위한 잘못된 시도에 묶으면 Docker는 아무도 도움이되지 않는 일련의 나쁜 추상화로 안장됩니다. nathanleclaire.com/blog/2014/09/29/…
Jason

1
자, 이것이 왜 이것이 cp명령 보다 나은지 모르겠습니다. 왜 더 좋은지 설명 할 수 있습니까? 또한 파이프가 혼란스럽고 지나치게 복잡하다고 생각합니다. tar 명령을 build 명령 위에 두지 마십시오. 그런 다음 심볼릭 링크 된 디렉토리를 실제 디렉토리로 덮어 쓰므로 추측합니다.
Alexander Mills

1
@AlexanderMills-일어나는 일을 확인하는 가장 좋은 방법은 시도하고 차이를 보는 것입니다. 또한 위는 달리지 않는 컨테이너의 건물이므로 장착이 없습니다. stackoverflow.com/questions/37328370/… . 나는 당신이이 모든 것들을 시험해 볼 것을 강력히 권합니다.
slm

1
/bin/cp ../requirements.txt . && docker build ...Docker를 만들기 위해 Makefile에 방금 추가 했습니다. 더 쉬워
졌습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.