mirror of
https://github.com/andwati/dokploy.git
synced 2026-11-06 04:02:16 +00:00
fix(compose): preserve named-volume access mode when adding suffix
The randomize/isolated-deployment volume transform split mount strings on ':' and kept only the first two segments, so an access mode like :ro, :z or :Z was silently dropped and read-only mounts became read-write. Keep the full path+mode remainder when rebuilding the mount string. Fixes #4818
This commit is contained in:
@@ -42,6 +42,39 @@ test("Add suffix to volumes declared directly in services", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const composeFileAccessMode = `
|
||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: nginx:alpine
|
||||||
|
volumes:
|
||||||
|
- web_config:/etc/nginx/conf.d:ro
|
||||||
|
- certs/sub:/etc/certs:Z
|
||||||
|
`;
|
||||||
|
|
||||||
|
test("Add suffix to volumes preserves access mode (:ro, :z, :Z)", () => {
|
||||||
|
const composeData = parse(composeFileAccessMode) as ComposeSpecification;
|
||||||
|
|
||||||
|
const suffix = generateRandomHash();
|
||||||
|
|
||||||
|
if (!composeData.services) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const updatedComposeData = addSuffixToVolumesInServices(
|
||||||
|
composeData.services,
|
||||||
|
suffix,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(updatedComposeData.web?.volumes).toContain(
|
||||||
|
`web_config-${suffix}:/etc/nginx/conf.d:ro`,
|
||||||
|
);
|
||||||
|
expect(updatedComposeData.web?.volumes).toContain(
|
||||||
|
`certs-${suffix}/sub:/etc/certs:Z`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
const composeFileTypeVolume = `
|
const composeFileTypeVolume = `
|
||||||
version: "3.8"
|
version: "3.8"
|
||||||
|
|
||||||
|
|||||||
@@ -26,11 +26,14 @@ export const addSuffixToVolumesInServices = (
|
|||||||
if (_.has(newServiceConfig, "volumes")) {
|
if (_.has(newServiceConfig, "volumes")) {
|
||||||
newServiceConfig.volumes = _.map(newServiceConfig.volumes, (volume) => {
|
newServiceConfig.volumes = _.map(newServiceConfig.volumes, (volume) => {
|
||||||
if (_.isString(volume)) {
|
if (_.isString(volume)) {
|
||||||
const [volumeName, path] = volume.split(":");
|
// remainder is the container path plus optional access mode (:ro, :z, :Z)
|
||||||
|
const [volumeName, ...pathAndMode] = volume.split(":");
|
||||||
|
const remainder = pathAndMode.join(":");
|
||||||
|
|
||||||
// skip bind mounts and variables (e.g. $PWD)
|
// skip bind mounts and variables (e.g. $PWD)
|
||||||
if (
|
if (
|
||||||
!volumeName ||
|
!volumeName ||
|
||||||
|
!remainder ||
|
||||||
volumeName.startsWith(".") ||
|
volumeName.startsWith(".") ||
|
||||||
volumeName.startsWith("/") ||
|
volumeName.startsWith("/") ||
|
||||||
volumeName.startsWith("$")
|
volumeName.startsWith("$")
|
||||||
@@ -43,10 +46,10 @@ export const addSuffixToVolumesInServices = (
|
|||||||
if (parts.length > 1) {
|
if (parts.length > 1) {
|
||||||
const baseName = parts[0];
|
const baseName = parts[0];
|
||||||
const rest = parts.slice(1).join("/");
|
const rest = parts.slice(1).join("/");
|
||||||
return `${baseName}-${suffix}/${rest}:${path}`;
|
return `${baseName}-${suffix}/${rest}:${remainder}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return `${volumeName}-${suffix}:${path}`;
|
return `${volumeName}-${suffix}:${remainder}`;
|
||||||
}
|
}
|
||||||
if (_.isObject(volume) && volume.type === "volume" && volume.source) {
|
if (_.isObject(volume) && volume.type === "volume" && volume.source) {
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in New Issue
Block a user