diff options
| -rw-r--r-- | cmd/seaweedfs-mount/Dockerfile | 7 | ||||
| -rw-r--r-- | cmd/seaweedfs-mount/Dockerfile.dev | 23 | ||||
| -rw-r--r-- | deploy/kubernetes/seaweedfs-csi.yaml | 6 | ||||
| -rw-r--r-- | pkg/driver/driver.go | 33 | ||||
| -rw-r--r-- | pkg/driver/mounter.go | 2 | ||||
| -rw-r--r-- | pkg/driver/volume.go | 2 | ||||
| -rw-r--r-- | pkg/mountmanager/client.go | 5 | ||||
| -rw-r--r-- | pkg/mountmanager/manager.go | 2 | ||||
| -rw-r--r-- | pkg/mountmanager/socket.go | 12 |
9 files changed, 62 insertions, 30 deletions
diff --git a/cmd/seaweedfs-mount/Dockerfile b/cmd/seaweedfs-mount/Dockerfile index 264d397..c6651e0 100644 --- a/cmd/seaweedfs-mount/Dockerfile +++ b/cmd/seaweedfs-mount/Dockerfile @@ -1,10 +1,13 @@ +ARG SEAWEEDFS_VERSION=4.01 + FROM golang:1.25-alpine AS builder RUN apk add git g++ -# Build weed binary +# Build weed binary (pinned to specific version for reproducibility) +ARG SEAWEEDFS_VERSION RUN mkdir -p /go/src/github.com/seaweedfs/ -RUN git clone https://github.com/seaweedfs/seaweedfs /go/src/github.com/seaweedfs/seaweedfs +RUN git clone --depth 1 --branch ${SEAWEEDFS_VERSION} https://github.com/seaweedfs/seaweedfs /go/src/github.com/seaweedfs/seaweedfs RUN cd /go/src/github.com/seaweedfs/seaweedfs/weed && go install && go clean -cache -modcache # Build seaweedfs-mount from current context diff --git a/cmd/seaweedfs-mount/Dockerfile.dev b/cmd/seaweedfs-mount/Dockerfile.dev index 99ccea3..f18af78 100644 --- a/cmd/seaweedfs-mount/Dockerfile.dev +++ b/cmd/seaweedfs-mount/Dockerfile.dev @@ -1,20 +1,25 @@ -FROM golang:1.24-alpine AS builder -RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories +ARG SEAWEEDFS_VERSION=4.01 + +FROM golang:1.25-alpine AS builder + RUN apk add git g++ +# Build weed binary (pinned to specific version for reproducibility) +ARG SEAWEEDFS_VERSION RUN mkdir -p /go/src/github.com/seaweedfs/ -RUN git clone https://github.com/seaweedfs/seaweedfs /go/src/github.com/seaweedfs/seaweedfs +RUN git clone --depth 1 --branch ${SEAWEEDFS_VERSION} https://github.com/seaweedfs/seaweedfs /go/src/github.com/seaweedfs/seaweedfs RUN cd /go/src/github.com/seaweedfs/seaweedfs/weed && go install -RUN mkdir -p /go/src/github.com/zemul/ -RUN git clone https://github.com/zemul/seaweedfs-csi-driver /go/src/github.com/zemul/seaweedfs-csi-driver -RUN cd /go/src/github.com/zemul/seaweedfs-csi-driver && \ - go build -ldflags="-s -w" -o /seaweedfs-mount ./cmd/seaweedfs-mount/main.go +# Build seaweedfs-mount from current context +WORKDIR /go/src/github.com/seaweedfs/seaweedfs-csi-driver +COPY . . + +RUN go build -ldflags="-s -w" -o /seaweedfs-mount ./cmd/seaweedfs-mount/main.go FROM alpine AS final -RUN apk add fuse +RUN apk add fuse COPY --from=builder /go/bin/weed /usr/bin/ COPY --from=builder /seaweedfs-mount / RUN chmod +x /seaweedfs-mount -ENTRYPOINT ["/seaweedfs-mount"]
\ No newline at end of file +ENTRYPOINT ["/seaweedfs-mount"] diff --git a/deploy/kubernetes/seaweedfs-csi.yaml b/deploy/kubernetes/seaweedfs-csi.yaml index 2fc4f9b..9fb140b 100644 --- a/deploy/kubernetes/seaweedfs-csi.yaml +++ b/deploy/kubernetes/seaweedfs-csi.yaml @@ -216,7 +216,7 @@ spec: add: - SYS_ADMIN privileged: true - image: chrislusf/seaweedfs-csi-driver:latest + image: chrislusf/seaweedfs-csi-driver:dev imagePullPolicy: IfNotPresent args: - --endpoint=$(CSI_ENDPOINT) @@ -375,7 +375,7 @@ spec: add: - SYS_ADMIN privileged: true - image: chrislusf/seaweedfs-mount:latest + image: chrislusf/seaweedfs-mount:dev imagePullPolicy: IfNotPresent args: - --endpoint=$(MOUNT_ENDPOINT) @@ -444,7 +444,7 @@ spec: containers: # SeaweedFs Plugin (controller) - name: seaweedfs-csi-plugin - image: chrislusf/seaweedfs-csi-driver:latest + image: chrislusf/seaweedfs-csi-driver:dev imagePullPolicy: IfNotPresent args : - --endpoint=$(CSI_ENDPOINT) diff --git a/pkg/driver/driver.go b/pkg/driver/driver.go index d162369..6bdcc3b 100644 --- a/pkg/driver/driver.go +++ b/pkg/driver/driver.go @@ -4,10 +4,12 @@ import ( "fmt" "os" "os/signal" + "path/filepath" "syscall" "github.com/container-storage-interface/spec/lib/go/csi" "github.com/seaweedfs/seaweedfs-csi-driver/pkg/datalocality" + "github.com/seaweedfs/seaweedfs-csi-driver/pkg/mountmanager" "github.com/seaweedfs/seaweedfs/weed/glog" "github.com/seaweedfs/seaweedfs/weed/pb" "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" @@ -27,8 +29,9 @@ type SeaweedFsDriver struct { nodeID string version string - endpoint string - mountEndpoint string + endpoint string + mountEndpoint string + volumeSocketDir string // directory for volume sockets, derived from mountEndpoint vcap []*csi.VolumeCapability_AccessMode cscap []*csi.ControllerServiceCapability @@ -55,15 +58,25 @@ func NewSeaweedFsDriver(name, filer, nodeID, endpoint, mountEndpoint string, ena util.LoadConfiguration("security", false) + // Derive volumeSocketDir from mountEndpoint + volumeSocketDir := mountmanager.DefaultSocketDir + if mountEndpoint != "" { + _, address, err := mountmanager.ParseEndpoint(mountEndpoint) + if err == nil && address != "" { + volumeSocketDir = filepath.Dir(address) + } + } + n := &SeaweedFsDriver{ - endpoint: endpoint, - mountEndpoint: mountEndpoint, - nodeID: nodeID, - name: name, - version: version, - filers: pb.ServerAddresses(filer).ToAddresses(), - grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.client"), - signature: util.RandomInt32(), + endpoint: endpoint, + mountEndpoint: mountEndpoint, + volumeSocketDir: volumeSocketDir, + nodeID: nodeID, + name: name, + version: version, + filers: pb.ServerAddresses(filer).ToAddresses(), + grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.client"), + signature: util.RandomInt32(), } n.AddVolumeCapabilityAccessModes([]csi.VolumeCapability_AccessMode_Mode{ diff --git a/pkg/driver/mounter.go b/pkg/driver/mounter.go index d86d82e..b96f4b8 100644 --- a/pkg/driver/mounter.go +++ b/pkg/driver/mounter.go @@ -68,7 +68,7 @@ func (m *mountServiceMounter) Mount(target string) (Unmounter, error) { cacheBase = os.TempDir() } cacheDir := filepath.Join(cacheBase, m.volumeID) - localSocket := mountmanager.LocalSocketPath(m.volumeID) + localSocket := mountmanager.LocalSocketPath(m.driver.volumeSocketDir, m.volumeID) args, err := m.buildMountArgs(target, cacheDir, localSocket, filers) if err != nil { diff --git a/pkg/driver/volume.go b/pkg/driver/volume.go index 9e258a8..18d5c2a 100644 --- a/pkg/driver/volume.go +++ b/pkg/driver/volume.go @@ -29,7 +29,7 @@ func NewVolume(volumeID string, mounter Mounter, driver *SeaweedFsDriver) *Volum return &Volume{ VolumeId: volumeID, mounter: mounter, - localSocket: mountmanager.LocalSocketPath(volumeID), + localSocket: mountmanager.LocalSocketPath(driver.volumeSocketDir, volumeID), driver: driver, } } diff --git a/pkg/mountmanager/client.go b/pkg/mountmanager/client.go index 6288c44..7cbfe63 100644 --- a/pkg/mountmanager/client.go +++ b/pkg/mountmanager/client.go @@ -85,7 +85,10 @@ func (c *Client) doPost(path string, payload any, out any) error { if err := json.NewDecoder(resp.Body).Decode(&errResp); err == nil && errResp.Error != "" { return errors.New(errResp.Error) } - data, _ := io.ReadAll(resp.Body) + data, readErr := io.ReadAll(resp.Body) + if readErr != nil { + return fmt.Errorf("mount service error: %s (failed to read body: %v)", resp.Status, readErr) + } return fmt.Errorf("mount service error: %s (%s)", resp.Status, string(data)) } diff --git a/pkg/mountmanager/manager.go b/pkg/mountmanager/manager.go index 0fa3e0a..7e94b89 100644 --- a/pkg/mountmanager/manager.go +++ b/pkg/mountmanager/manager.go @@ -98,7 +98,7 @@ func (m *Manager) Unmount(req *UnmountRequest) (*UnmountResponse, error) { if ok, err := kubeMounter.IsMountPoint(entry.targetPath); ok || mount.IsCorruptedMnt(err) { if err = kubeMounter.Unmount(entry.targetPath); err != nil { - return &UnmountResponse{}, err + return nil, err } } diff --git a/pkg/mountmanager/socket.go b/pkg/mountmanager/socket.go index 1b8a079..f327dcb 100644 --- a/pkg/mountmanager/socket.go +++ b/pkg/mountmanager/socket.go @@ -2,15 +2,23 @@ package mountmanager import ( "fmt" + "path/filepath" "github.com/seaweedfs/seaweedfs/weed/util" ) +// DefaultSocketDir is the default directory for volume sockets. +const DefaultSocketDir = "/var/lib/seaweedfs-mount" + // LocalSocketPath returns the unix socket path used to communicate with the weed mount process. -func LocalSocketPath(volumeID string) string { +// The baseDir parameter should be the directory where sockets are stored (e.g., derived from mountEndpoint). +func LocalSocketPath(baseDir, volumeID string) string { + if baseDir == "" { + baseDir = DefaultSocketDir + } hash := util.HashToInt32([]byte(volumeID)) if hash < 0 { hash = -hash } - return fmt.Sprintf("/var/lib/seaweedfs-mount/seaweedfs-mount-%d.sock", hash) + return filepath.Join(baseDir, fmt.Sprintf("seaweedfs-mount-%d.sock", hash)) } |
