作者:张华 发表于:2025-12-30
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明
docker image
cat << EOF |tee app.py from flask import Flask import os app = Flask(__name__) @app.route('/') def hello(): greeting = os.environ.get("GREETING", "Hello") return f"{greeting} from the container!" if __name__ == '__main__': app.run(host='0.0.0.0', port=8080) EOF cat << EOF |tee Dockerfile FROM ubuntu:24.04 RUN apt update \ && apt install --yes --no-install-recommends python3 python3-pip \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY requirements.txt . COPY app.py . RUN pip3 install -r requirements.txt --root / ENV GREETING="Hello Docker" ENV PORT=8080 EXPOSE \$PORT CMD ["python3", "app.py"] EOF cat << EOF |tee requirements.txt Flask==3.1.2 EOF sudo apt install docker.io -y sudo docker build -t hello:v1 . sudo docker run -d -p 8080:8080 --name hello hello:v1rock image
rock image将使用Pebble来代替docker image中的CMD/ENTRYPOINT来定义services.
rock image并不是以传统 Docker image的形式存储在本地 registry 里,而是:在构建过程中,rockcraft 会使用 skopeo 从远程仓库(如 public.ecr.aws/ubuntu/ubuntu:24.04)拉取 base 镜像;然后将其转换为 OCI 格式,并临时存放在 /root/images/ 目录下(注意:这是在 rockcraft 启动的 lxc容器内部,不是你主机的 /root!);最终生成的是一个.rock 文件(类似 .snap),它是一个 squashfs 或tar压缩包,包含整个 rootfs 和元数据。
cat << EOF |tee rockcraft.yaml name: hello-rock base: ubuntu@24.04 version: "0.1" summary: hello rock description: | This is a hello rock image platforms: amd64: environment: GREETING: "Hello Rock" PORT: "8080" services: app: override: replace command: python3 usr/bin/app.py startup: enabled checks: app-check: override: replace http: url: http://localhost:8080/ parts: app: plugin: nil source: . build-packages: - python3 - python3-venv - python3-pip stage-packages: - python3 override-build: | pip install -r requirements.txt --root \${CRAFT_PART_INSTALL} install -D -m 755 app.py \${CRAFT_PART_INSTALL}/usr/bin/app.py EOF sudo snap install rockcraft --classic #rockcraft clean lxc delete --project rockcraft rockcraft-hello-rock-amd64-8520382 --force #NOTE: the domain 'cloudfront.net' has been blocked rockcraft pack ls hello-rock_0.1_amd64.rock lxc list --project rockcraft lxc exec --project rockcraft rockcraft-hello-rock-amd64-8520382 -- bash curl -v https://public.ecr.aws/v2/ curl -v https://d5l0dvt14r5h8.cloudfront.net/v2/ #/snap/rockcraft/current/bin/skopeo --insecure-policy --override-arch amd64 copy --retry-times 5 docker://public.ecr.aws/ubuntu/ubuntu:24.04 oci:/root/images/ubuntu:24.04 #/snap/rockcraft/current/bin/skopeo --insecure-policy copy docker://public.ecr.aws/ubuntu/ubuntu:24.04 oci:/tmp/test-ubuntu:24.04 $ lxc list --project rockcraft |grep -i container | base-instance-rockcraft-buildd-base-v71--8246325508671f1569c1 | STOPPED | | | CONTAINER | 0 | | rockcraft-hello-rock-amd64-8520382 | STOPPED | | | CONTAINER | 0 |在docker里测试rock image:
#tar archive can be read by skopeo $ file hello-rock_0.1_amd64.rock hello-rock_0.1_amd64.rock: POSIX tar archive sudo apt install skopeo -y sudo skopeo copy oci-archive:hello-rock_0.1_amd64.rock docker-daemon:hello-rock:0.1 sudo docker run -it --rm hello-rock:0.1 curl -v http://localhost:8080 #debug it sudo docker ps |grep rock sudo docker exec frosty_wright /usr/bin/pebble logs app sudo docker run -d -p 8080:8080 -it --rm hello-rock:0.1 curl http://localhost:8080debug it
$ sudo docker ps |grep rock 6b09134e6413 hello-rock:0.1 "/usr/bin/pebble ent…" 3 minutes ago Up 3 minutes pensive_wozniak $ sudo docker exec -it frosty_wright ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1233912 11520 pts/0 Ssl+ 07:29 0:00 /usr/bin/pebble enter root 16 1.1 0.2 115816 34860 pts/0 S 07:29 0:00 python3 usr/bin/app.py root 22 50.0 0.0 7888 3840 pts/1 Rs+ 07:30 0:00 ps aux #run it in the front-end without '-d' sudo docker run -p 8080:8080 -it --rm --entrypoint /bin/sh hello-rock:0.1 # python3 /usr/bin/app.py ... * Running on http://127.0.0.1:8080 Press CTRL+C to quit