← Sandbox SDK / sandbox / guides
Spuštění Docker-in-Docker
Tato příručka ukazuje, jak spustit Docker uvnitř Sandboxu, což vám umožní sestavovat a spouštět kontejnerové image přímo v rámci zabezpečeného sandboxu.
Kdy použít Docker-in-Docker
Docker-in-Docker použijte, když potřebujete:
- Vyvíjejte kontejnerizované aplikace - Spusťte
docker buildpro vytváření images ze souborů Dockerfile - Spuštění Dockeru jako součásti CI/CD - Reagování na změny kódu a sestavování a nahrávání imagí pomocí Cloudflare Containers
- Spouštění libovolných obrazů kontejnerů - Spouštění kontejnerů z image poskytnutého koncovým uživatelem
Vytvoření image s podporou Dockeru
Cloudflare Containers běží bez oprávnění roota, proto musíte použít bezrootový Docker image. Vytvořte vlastní Dockerfile, který zkombinuje binární soubor sandboxu s Dockerem:
Dockerfile
FROM docker:dind-rootless
USER root
# Use the musl build so it runs on Alpine-based docker:dind-rootless
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /container-server/sandbox /sandbox
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /usr/lib/libstdc++.so.6 /usr/lib/libstdc++.so.6
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /usr/lib/libgcc_s.so.1 /usr/lib/libgcc_s.so.1
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /bin/bash /bin/bash
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /usr/lib/libreadline.so.8 /usr/lib/libreadline.so.8
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /usr/lib/libreadline.so.8.2 /usr/lib/libreadline.so.8.2
# Create startup script that starts dockerd with
# iptables disabled, waits for readiness, then keeps running
RUN printf '#!/bin/sh\n\
set -eu\n\
dockerd-entrypoint.sh dockerd --iptables=false --ip6tables=false &\n\
until docker version >/dev/null 2>&1; do sleep 0.2; done\n\
echo "Docker is ready"\n\
wait\n' > /home/rootless/boot-docker-for-dind.sh && chmod +x /home/rootless/boot-docker-for-dind.sh
ENTRYPOINT ["/sandbox"]
CMD ["/home/rootless/boot-docker-for-dind.sh"]Používejte Docker ve svém sandboxu
Po nasazení můžete přes sandbox spouštět příkazy Dockeru:
import { getSandbox } from "@cloudflare/sandbox";
const sandbox = getSandbox(env.Sandbox, "docker-sandbox");
// Build an image
await sandbox.writeFile(
"/workspace/Dockerfile",
`
FROM alpine:latest
RUN apk add --no-cache curl
CMD ["echo", "Hello from Docker!"]
`,
);
const build = await sandbox.exec(
"docker build --network=host -t my-image /workspace",
);
if (!build.success) {
console.error("Build failed:", build.stderr);
}
// Run a container
const run = await sandbox.exec("docker run --network=host --rm my-image");
console.log(run.stdout); // "Hello from Docker!"import { getSandbox } from "@cloudflare/sandbox";
const sandbox = getSandbox(env.Sandbox, "docker-sandbox");
// Build an image
await sandbox.writeFile(
"/workspace/Dockerfile",
`
FROM alpine:latest
RUN apk add --no-cache curl
CMD ["echo", "Hello from Docker!"]
`,
);
const build = await sandbox.exec(
"docker build --network=host -t my-image /workspace",
);
if (!build.success) {
console.error("Build failed:", build.stderr);
}
// Run a container
const run = await sandbox.exec("docker run --network=host --rm my-image");
console.log(run.stdout); // "Hello from Docker!"Omezení
Docker-in-Docker v Cloudflare Containers má následující omezení:
- Žádné iptables - Funkce síťové izolace založené na iptables nejsou k dispozici
- Pouze režim rootless - Nemůžete používat privilegované kontejnery ani funkce vyžadující root
- Dočasné úložiště - Sestavené obrazy a kontejnery se ztratí, jakmile sandbox usne. Musíte je ručně uložit.
Související zdroje
- Referenční dokumentace Dockerfile - Přizpůsobte si obraz sandboxu
- Spouštění příkazů - Spouštění příkazů v sandboxu
- Procesy na pozadí - Správa dlouhotrvajících procesů