저는 Docker를 사용하여 이미지를 생성 openjdk:8-jdk-alpine
하고 sshfs + fusion을 사용하여 원격 폴더를 마운트하려고 합니다. 이를 위해 컨테이너를 실행합니다.docker run -d --rm --device /dev/fuse --privileged my_container
Dockerfile의 코드에 다음 줄을 추가했습니다.
RUN echo "sshfs#myuser@${host}:${folder} $mount_folder fuse allow_other,default_permissions,umask=0007,idmap=file,uidfile=/etc/sshfs_umap,gidfile=/etc/sshfs_gmap,nomap=ignore,StrictHostKeyChecking=no,IdentityFile=/root/.ssh/id_rsa 0 0" >> /etc/fstab
이 줄은 기본적으로 sshfs를 사용하여 원격 폴더를 /etc/fstab에 마운트하는 명령을 추가합니다. 컨테이너에 액세스하면 내 파일이 표시되지 않지만 mount_folder
수동으로 실행하면
$mount -a
폴더가 성공적으로 마운트되었습니다. 컨테이너가 시작될 때 어떻게 자동으로 설치할 수 있나요?
답변1
다음 Dockerfile 실행 명령을 실행하는 대신 작동하게 만들었습니다.
RUN echo "sshfs#myuser@${host}:${folder} $mount_folder fuse allow_other,default_permissions,umask=0007,idmap=file,uidfile=/etc/sshfs_umap,gidfile=/etc/sshfs_gmap,nomap=ignore,StrictHostKeyChecking=no,IdentityFile=/root/.ssh/id_rsa 0 0" >> /etc/fstab
이를 제거하고 .sh 스크립트를 실행하고 다음 줄을 포함하는 dockerfile에 CMD 명령을 추가했습니다.
#!/bin/sh
sshfs -o allow_other -o reconnect -o default_permissions -o 'umask=0007' -o 'idmap=file' -o 'uidfile=/etc/sshfs_umap' -o 'gidfile=/etc/sshfs_gmap' -o 'nomap=ignore' -o 'StrictHostKeyChecking=no' -o 'IdentityFile=/root/.ssh/id_rsa' myuser@$SFTP_HOST:$SFTP_ROOT_FOLDER /myfolder
#do tother things here to run your app
원격 파일 시스템은 Docker 컨테이너가 실행될 때마다 마운트됩니다. /etc/fstab이 실행되지 않는 이유는 아마도 컨테이너이기 때문에 실제로 처음부터 시작되지 않았기 때문일 것입니다. 따라서 /etc/fstab은 실행되지 않습니다.
답변2
docker run -it --rm debian cat /etc/fstab
# UNCONFIGURED FSTAB FOR BASE SYSTEM
failed to resize tty, using default size
Docker 컨테이너의 fstab을 변경할 수 있다는 사실조차 몰랐지만 왜 그렇게 하려는지 혼란스럽습니다. 일반적으로 docker는 파일 시스템 마운트를 처리하며 볼륨 드라이버/플러그인도 있습니다. 이를 수행하는 SSHFS의 경우 이 모든 것을 처리합니다.
docker plugin install vieux/sshfs
Plugin "vieux/sshfs" is requesting the following privileges:
- network: [host]
- mount: [/var/lib/docker/plugins/]
- mount: []
- device: [/dev/fuse]
- capabilities: [CAP_SYS_ADMIN]
Do you grant the above permissions? [y/N] y
latest: Pulling from vieux/sshfs
Digest: sha256:1d3c3e42c12138da5ef7873b97f7f32cf99fb6edde75fa4f0bcf9ed277855811
52d435ada6a4: Complete
Installed plugin vieux/sshfs
docker volume create -d vieux/sshfs -o sshcmd=root@localhost:/srv/ -o password=changeme mysshvol
docker run -it --rm -v mysshvol:/mnt debian
이 일을 하지 않는 이유는 무엇입니까? 내 경험에 따르면 실제로 Docker용 볼륨 드라이버/플러그인을 개발하는 경우가 아니면 볼륨 마운트/매핑을 Docker에 맡기는 것이 가장 좋습니다. 이로 인해 추가 번거로움과 추가 종속성이 발생하거나 컨테이너가 특정 볼륨을 마운트할 필요가 없습니다. . 파일 시스템을 컨테이너로.