Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Docker zero downtime rollout #170

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
22 changes: 22 additions & 0 deletions backend/socket-handlers/docker-socket-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,28 @@ export class DockerSocketHandler extends SocketHandler {
}
});

// rolloutStack
socket.on("rolloutStack", async (stackName : unknown, callback) => {
try {
checkLogin(socket);

if (typeof(stackName) !== "string") {
throw new ValidationError("Stack name must be a string");
}

const stack = Stack.getStack(server, stackName);
await stack.rollout(socket);
callback({
ok: true,
msg: "Rolled out"
});
server.sendStackList();
stack.joinCombinedTerminal(socket);
} catch (e) {
callbackError(e, callback);
}
});

// down stack
socket.on("downStack", async (stackName : unknown, callback) => {
try {
Expand Down
15 changes: 15 additions & 0 deletions backend/stack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,21 @@ export class Stack {
return exitCode;
}

async rollout(socket: DockgeSocket) {
let terminalName = getComposeTerminalName(this.name);
let exitCode = await Terminal.exec(this.server, socket, terminalName, "docker", [ "compose", "pull" ], this.path);
if (exitCode !== 0) {
throw new Error("Failed to pull, please check the terminal output for more information.");
}

terminalName = getComposeTerminalName(this.name);
exitCode = await Terminal.exec(this.server, socket, terminalName, "docker", [ "rollout", this.name ], this.path);
if (exitCode !== 0) {
throw new Error("Failed to rollout, please check the terminal output for more information.");
}
return exitCode;
}

async stop(socket: DockgeSocket) : Promise<number> {
const terminalName = getComposeTerminalName(this.name);
let exitCode = await Terminal.exec(this.server, socket, terminalName, "docker", [ "compose", "stop" ], this.path);
Expand Down
17 changes: 5 additions & 12 deletions docker/Base.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,8 @@ RUN apt update && apt install --yes --no-install-recommends \
&& npm install pnpm -g \
&& pnpm install -g tsx

# ensures that /var/run/docker.sock exists
# changes the ownership of /var/run/docker.sock
RUN touch /var/run/docker.sock && chown node:node /var/run/docker.sock

# Full Base Image
# MariaDB, Chromium and fonts
#FROM base-slim AS base
#ENV DOCKGE_ENABLE_EMBEDDED_MARIADB=1
#RUN apt update && \
# apt --yes --no-install-recommends install mariadb-server && \
# rm -rf /var/lib/apt/lists/* && \
# apt --yes autoremove
# Install docker rollout plugin \
RUN mkdir -p ~/.docker/cli-plugins \
&& curl https://raw.githubusercontent.com/wowu/docker-rollout/master/docker-rollout -o ~/.docker/cli-plugins/docker-rollout \
&& chmod +x ~/.docker/cli-plugins/docker-rollout \
&& docker rollout --help
2 changes: 2 additions & 0 deletions frontend/src/icon.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import {
faTerminal, faWarehouse, faHome, faRocket,
faRotate,
faCloudArrowDown, faArrowsRotate,
faPaintRoller,
} from "@fortawesome/free-solid-svg-icons";

library.add(
Expand Down Expand Up @@ -109,6 +110,7 @@ library.add(
faRotate,
faCloudArrowDown,
faArrowsRotate,
faPaintRoller,
);

export { FontAwesomeIcon };
Expand Down
1 change: 1 addition & 0 deletions frontend/src/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
"updateStack": "Update",
"startStack": "Start",
"downStack": "Stop & Down",
"rolloutStack": "Rollout Update (Zero Downtime)",
"editStack": "Edit",
"discardStack": "Discard",
"saveStackDraft": "Save",
Expand Down
17 changes: 15 additions & 2 deletions frontend/src/pages/Compose.vue
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,15 @@
{{ $t("stopStack") }}
</button>

<BDropdown v-if="!isEditMode && active" right text="" variant="normal">
<BDropdownItem @click="downStack">
<BDropdown v-if="!isEditMode || active" right text="" variant="normal">
<BDropdownItem v-if="!isEditMode" @click="downStack">
<font-awesome-icon icon="stop" class="me-1" />
{{ $t("downStack") }}
</BDropdownItem>
<BDropdownItem v-if="active" @click="rolloutStack">
<font-awesome-icon icon="paint-roller" class="me-1" />
{{ $t("rolloutStack") }} <span class="badge bg-info">Beta</span>
</BDropdownItem>
</BDropdown>
</div>

Expand Down Expand Up @@ -486,6 +490,15 @@ export default {
});
},

rolloutStack() {
this.processing = true;

this.$root.getSocket().emit("rolloutStack", this.stack.name, (res) => {
this.processing = false;
this.$root.toastRes(res);
});
},

downStack() {
this.processing = true;

Expand Down