programing

도커 컨테이너 안에 심볼릭 링크가 있는 호스트 디렉토리를 마운트합니다.

closeapi 2023. 9. 8. 21:30
반응형

도커 컨테이너 안에 심볼릭 링크가 있는 호스트 디렉토리를 마운트합니다.

다음 매개 변수로 컨테이너를 장착했습니다.

-v/home/test/:/home/test

호스트의 /home/test 안에는 /mnt/ 폴더를 가리키는 기호 링크가 있습니다.

그러나 이 링크는 어디를 가리키는지 알 수 있지만 컨테이너 내부에서 끊어진 것 같습니다.

root@f93f72b45013:/var/www/html# cd /home/test/ 
root@f93f72b45013:/home/test# ls -lrt 
total 11956 
lrwxrwxrwx. 1 root root 40 Jul 20 15:55 file -> /mnt/mountedfile/
root@f93f72b45013:/home/test# ls -lrt file/*
ls: cannot access file/*: No such file or directory

그것이 도커에서 행해지는 것이 가능하기는 합니까?나는 그것을 할 방법이 있는지 잘 모르겠습니다.

심볼릭 링크가 가리키는 곳에 바로 장착할 수 있다는 것을 알고 있지만 이것이 가능한지 궁금했습니다.

심볼링크는 도커 내부에서 큰 도전과제입니다.사용자의 경우 두 디렉토리를 모두 마운트할 수 있습니다.

-v /home/test/:/home/test -v /mnt/mountedfile:/mnt/mountedfile

심볼릭 링크가 컨테이너 내부와 외부 모두에서 작동하려면 절대 경로여야 하며 정확히 동일한 이름을 사용해야 합니다.

일반적으로 심볼 링크는 도커 내부에서 작동하지 않습니다.저는 이것이 어렵다는 것을 알았습니다.

한 가지 해결책은 도커가 원본 파일을 마운트하도록 하는 것이지만,readlink -f파일의 실제 위치를 인쇄합니다.이렇게 하면 명령어에서 symlink 위치를 계속 참조할 수 있습니다.

docker run -it -v $(readlink -f /home/test/):/home/test/ ...

안녕하세요 도와주셔서 감사합니다 저의 경우 angular nginx app에서 https를 활성화하는 데 어려움을 겪고 있었습니다.

docker run -p 80:80 -p 443:443 \
   --name test \
   -v /etc/letsencrypt/live/exemple.com:/etc/nginx/certs \
   -v /home/admin/nginx-default.conf:/etc/nginx/conf.d/default.conf:ro test

도커 내부에 cert.pem 및 privkey.pem 링크를 마운트하지 않음

하지만 내가 모든 파일 경로를 명시적으로 그렇게 사용한다면,

docker run -p 80:80 -p 443:443 \
   --name test \
   -v /etc/letsencrypt/live/example.com/cert.pem:/etc/nginx/certs/cert.pem \
   -v /etc/letsencrypt/live/example.com/privkey.pem:/etc/nginx/certs/privkey.pem \
   -v /home/admin/nginx-default.conf:/etc/nginx/conf.d/default.conf:ro test

모든 것이 효과가 있었군요 도커 컴포지트로 똑같이 할 수 있을 것 같네요

이전 답변에 대해서는 답변을 드릴 수 없지만, 당신이 제안한 composite file의 전체 파일 경로를 설정하여 링크된 파일을 받아야 하는 유사한 시나리오에 대해서는 답변을 드릴 수 없습니다.

  - /opt/cert/ssl/live/example.com/cert.pem:/certs/cert.pem
  - /opt/cert/ssl/live/example.com/privkey.pem:/certs/privkey.pem

파일cert.pem그리고.privkey.pem아래example.com둘 다 certbot이 위치한 파일에 대한 링크입니다.

이것은 가능하지만 임의의 위치에 있는 임의 파일에 대한 심볼 링크가 있는 경우 "컨테이너를 생각"해야 합니다. 그러면 실제로 가치가 없을 수도 있습니다.

그러나 이와 같은 작업 가치가 있는 시나리오를 고려해 보십시오.

실제 파일이 있는 폴더와 실제 파일이 있는 폴더가 2개 있습니다.

/static-data/
|_ data-file1.dat
|_ data-file2.dat
|
|__index/
   |_a.txt
   |_b.txt

/other/
|_ data-file1.dat -> /static-data/data-file1.dat 
|_ data-file2.dat -> /static-data/data-file2.dat 
|
|__index/
   |_a.txt
   |_b.txt

이제 장착하면/other:/data

당신이 용기를 위해ls -lah /data끊어진 고리를 보게 될 겁니다 왜냐하면/static-data컨테이너에 존재하지 않습니다.해결책은 호스트에서 끊어진 링크를 생성하는 것입니다./other호스트가 깨지는 것은 직접적으로 중요하지 않으므로 새 구조는 다음과 같습니다.

/other/
|_ data-file1.dat -> /mirror/data-file1.dat 
|_ data-file2.dat -> /mirror/data-file2.dat 
|
|__index/
   |_a.txt
   |_b.txt

그러면 마운트 레코드가 2개 필요합니다.

/other:/data
/static-data:/mirror

Host에 에 Host 는 에서 를 할 에서 는 를 할 ./data/data-file1.dat -> /mirror/data-file1.dat컨테이너가 장착되어 있습니다./mirror는 "symlink"를 가리키고 있습니다./static-data/data-file1.dat

호스트에서 심볼 링크가 끊어지지 않도록 하려면 다음과 같이 두 디렉토리를 모두 마운트할 수 있습니다.

/other:/data
/static-data:/static-data

이제 링크는 Host와 컨테이너에서 유효하게 사용할 수 있습니다.이것이 가능하다는 것을 알 수 있듯이, 테스트를 해보았는데, 이는 명백한 파일 클러스터에만 가치가 있습니다.모든 것이 무작위인 경우, 컨테이너에 호스트 구조를 반영하기 위해 수많은 dir 또는 단일 파일을 탑재하게 됩니다.

저는 이 문제에 대해 좋은 방법이라고 생각합니다.

도커 컨테이너에서 호스트에서 마운트된 심볼 링크가 제대로 작동할 수 없습니다.그러나 도커 컨테이너 내부에 생성된 심볼 링크는 잘 작동합니다.따라서 관심 있는 루트(절대 경로)를 컨테이너에 먼저 장착한 다음 컨테이너 내부에 자신의 요구를 충족시키는 구조로 심링크를 생성하는 것이 좋습니다.이런 식으로 당신은 가도 좋습니다.

도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/38485607/mount-host-directory-with-a-symbolic-link-inside-in-docker-container

반응형