135 lines
5.1 KiB
Docker
135 lines
5.1 KiB
Docker
# CubeSandbox in a privileged systemd+DinD container.
|
|
#
|
|
# CubeSandbox's official install.sh is designed for bare metal / VMs and
|
|
# requires a running systemd (it registers all services as systemd units).
|
|
# This image therefore runs systemd as PID 1 rather than tini.
|
|
#
|
|
# UBUNTU_IMAGE may be overridden to use a regional mirror, e.g.:
|
|
# docker.m.daocloud.io/library/ubuntu:22.04 (China DaoCloud mirror)
|
|
# ccr.ccs.tencentyun.com/library/ubuntu:22.04 (Tencent Cloud mirror)
|
|
ARG UBUNTU_IMAGE=ubuntu:22.04
|
|
FROM ${UBUNTU_IMAGE}
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive \
|
|
LANG=C.UTF-8 \
|
|
LC_ALL=C.UTF-8
|
|
|
|
# Core system deps + systemd as the container init system.
|
|
# deploy/one-click/install.sh requires: tar, rg (ripgrep), ss (iproute2),
|
|
# bash, curl, sed, pgrep (procps), date, docker, python3, ip (iproute2), awk (gawk).
|
|
# Plus DinD prerequisites: iptables, ca-certificates, gnupg.
|
|
# Plus xfsprogs for the XFS-backed /data/cubelet (install.sh hard requirement).
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
systemd \
|
|
systemd-sysv \
|
|
dbus \
|
|
ca-certificates \
|
|
curl \
|
|
gnupg \
|
|
lsb-release \
|
|
bash \
|
|
tar \
|
|
ripgrep \
|
|
iproute2 \
|
|
procps \
|
|
gawk \
|
|
sed \
|
|
python3 \
|
|
python3-pip \
|
|
iptables \
|
|
kmod \
|
|
xfsprogs \
|
|
e2fsprogs \
|
|
util-linux \
|
|
file \
|
|
less \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Mask systemd units that are irrelevant or will fail in a container context.
|
|
RUN for unit in \
|
|
getty@tty1.service \
|
|
apt-daily.service \
|
|
apt-daily-upgrade.service \
|
|
apt-daily.timer \
|
|
apt-daily-upgrade.timer \
|
|
motd-news.service \
|
|
motd-news.timer \
|
|
systemd-networkd.service \
|
|
systemd-networkd-wait-online.service \
|
|
systemd-udevd.service \
|
|
systemd-udevd-control.socket \
|
|
systemd-udevd-kernel.socket \
|
|
systemd-logind.service \
|
|
e2scrub_reap.service \
|
|
apparmor.service; do \
|
|
ln -sf /dev/null "/etc/systemd/system/${unit}"; \
|
|
done
|
|
|
|
# Install Docker CE + Compose plugin from the official Docker apt repository.
|
|
RUN install -m 0755 -d /etc/apt/keyrings \
|
|
&& curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
|
|
| gpg --dearmor -o /etc/apt/keyrings/docker.gpg \
|
|
&& chmod a+r /etc/apt/keyrings/docker.gpg \
|
|
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
|
|
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" \
|
|
> /etc/apt/sources.list.d/docker.list \
|
|
&& apt-get update \
|
|
&& apt-get install -y --no-install-recommends \
|
|
docker-ce \
|
|
docker-ce-cli \
|
|
containerd.io \
|
|
docker-buildx-plugin \
|
|
docker-compose-plugin \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Configure Docker daemon defaults.
|
|
RUN mkdir -p /etc/docker && printf '%s\n' \
|
|
'{' \
|
|
' "log-driver": "json-file",' \
|
|
' "log-opts": { "max-size": "50m", "max-file": "3" },' \
|
|
' "storage-driver": "overlay2"' \
|
|
'}' > /etc/docker/daemon.json
|
|
|
|
# Install E2B Python SDK so smoke tests can run from inside the container
|
|
# without polluting the WSL2 host with pip packages.
|
|
RUN pip3 install --no-cache-dir --break-system-packages \
|
|
e2b-code-interpreter==1.0.* \
|
|
requests \
|
|
|| pip3 install --no-cache-dir \
|
|
e2b-code-interpreter==1.0.* \
|
|
requests
|
|
|
|
# Persistent locations the installer writes to.
|
|
VOLUME ["/var/lib/docker", "/data", "/usr/local/services/cubetoolbox"]
|
|
|
|
# Helper scripts for the bootstrap flow.
|
|
COPY cube-init.sh /usr/local/bin/cube-init.sh
|
|
COPY cube-xfs-setup.sh /usr/local/bin/cube-xfs-setup.sh
|
|
COPY cube-install.sh /usr/local/bin/cube-install.sh
|
|
RUN chmod +x \
|
|
/usr/local/bin/cube-init.sh \
|
|
/usr/local/bin/cube-xfs-setup.sh \
|
|
/usr/local/bin/cube-install.sh
|
|
|
|
# Systemd service units for the CubeSandbox bootstrap sequence.
|
|
COPY cube-xfs-mount.service /etc/systemd/system/cube-xfs-mount.service
|
|
COPY cube-install.service /etc/systemd/system/cube-install.service
|
|
|
|
# Enable services by creating the wanted-by symlinks that systemctl enable
|
|
# would create (systemctl cannot run during a Docker image build).
|
|
RUN mkdir -p /etc/systemd/system/multi-user.target.wants \
|
|
&& ln -sf /etc/systemd/system/cube-xfs-mount.service \
|
|
/etc/systemd/system/multi-user.target.wants/cube-xfs-mount.service \
|
|
&& ln -sf /etc/systemd/system/cube-install.service \
|
|
/etc/systemd/system/multi-user.target.wants/cube-install.service \
|
|
&& ln -sf /lib/systemd/system/docker.service \
|
|
/etc/systemd/system/multi-user.target.wants/docker.service \
|
|
&& ln -sf /lib/systemd/system/containerd.service \
|
|
/etc/systemd/system/multi-user.target.wants/containerd.service
|
|
|
|
# cube-init.sh captures CUBE_* and TZ env vars from the container runtime
|
|
# into /etc/cube-sandbox.env (readable by systemd EnvironmentFile=), then
|
|
# execs /lib/systemd/systemd as PID 1.
|
|
ENTRYPOINT ["/usr/local/bin/cube-init.sh"]
|
|
CMD ["/lib/systemd/systemd"]
|