Vấn đề
Mình đang dùng song song Gitpod và Codespaces (Github) thì thấy thằng Gitpod nó lưu mỗi thư mục /workspace
giữa các session thôi. Còn Codespace thì lưu toàn bộ trạng thái của container luôn.
Vì thế mà mình cũng muốn thằng Gitpod hành xử như thằng Codespaces. Cụ thế chẳng hạn như cài thêm các package bằng apt thì restart container không phải cài lại nữa.
Chỗ này mặc dù thiết kế của gitpod là stateless, mọi cài cắm sẽ được cài vào image hoặc script bootstrap. Nhưng mình vẫn thích lưu lại state của container, vì mình bật trường kỳ 1 container cho toàn bộ project khác nhau. Vấn đảm bảo được 2 yếu tố:
-
Stateless: Có Dockerfile, các script để cài cắm (reproducible)
-
Stateful: Lưu lại trạng thái, đỡ cài cắm lại mỗi lần bật tắt
Một phút dành cho quảng cáo: Mình có build image cho Gitpod và Codespaces tại https://github.com/TxGVNN/oops
Giải quyết vấn đề
Sử dụng fuse-overlayfs
để tạo thư mục overlay cho các thư mục mà mình muốn giữa lại, rồi thiết lập lưu trữ vào thư mục /workspace
Mình tạo 1 script lúc khởi chạy gitpod như sau:
#!/usr/bin/env bash
sudo apt update
sudo apt install -y fuse-overlayfs # Nên cài package này sẵn ở Dockerfile
# Chỗ này mình overlay 4 thư mục: /usr, /etc, /var/cache, /var/lib
if ! mount | grep -qE '/usr.*fuse-overlayfs'; then
sudo mkdir -p /workspaces/overlay/workir/usr /workspaces/overlay/usr
sudo fuse-overlayfs -o lowerdir=/usr,upperdir=/workspaces/overlay/usr,workdir=/workspaces/overlay/workir/usr /usr
fi
if ! mount | grep -qE '/etc.*fuse-overlayfs'; then
sudo mkdir -p /workspaces/overlay/workir/etc /workspaces/overlay/etc
sudo fuse-overlayfs -o lowerdir=/etc,upperdir=/workspaces/overlay/etc,workdir=/workspaces/overlay/workir/etc /etc
fi
if ! mount | grep -qE '/var\/cache.*fuse-overlayfs'; then
sudo mkdir -p /workspaces/overlay/workir/var/cache /workspaces/overlay/var/cache
sudo fuse-overlayfs -o lowerdir=/var/cache,upperdir=/workspaces/overlay/var/cache,workdir=/workspaces/overlay/workir/var/cache /var/cache
fi
if ! mount | grep -qE '/var\/lib.*fuse-overlayfs'; then
sudo mkdir -p /workspaces/overlay/workir/var/lib /workspaces/overlay/var/lib
sudo fuse-overlayfs -o lowerdir=/var/lib,upperdir=/workspaces/overlay/var/lib,workdir=/workspaces/overlay/workir/var/lib /var/lib
fi