1. Docker、镜像和容器
- Dockerfile:描述如何构建运行环境。
- 镜像 Image:根据 Dockerfile 构建出的只读模板。
- 容器 Container:镜像运行后产生的实例。
- 每次执行
docker run,通常都会基于镜像创建一个新容器。
Dockerfile
↓ docker build
Image
↓ docker run
Container
构建镜像:
docker build -t agents-docker .
其中:
-t agents-docker:给镜像命名。.:使用当前目录作为构建上下文。
Dockerfile 或镜像内的依赖发生变化后,需要重新构建:
docker build -t agents-docker .
可以在Docker Desktop中从Image中创造container,或者通过docker run的方式。
2. 配置dockerfile和项目文件
Configure the environment:
- linux system: Debian 12 Bookworm + python 3.12
- uv
FROM python:3.12-slim-bookworm
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
WORKDIR /app
CMD ["bash"]
pyproject.toml:
[project]
name = "agents-docker"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = [
"openai-agents",
"gradio",
]
同步环境:
uv sync
运行程序:
uv run python main.py
项目中主要有:
agents-docker/
├── Dockerfile
├── pyproject.toml
├── uv.lock
├── main.py
├── .env
└── .venv/
3. Bind mount:让容器直接看到项目文件
开发时可以把 Windows 当前项目目录挂载到容器的 /app:
docker run --rm -it `
--env-file .env `
--mount type=bind,source="${PWD}",target=/app `
agents-docker
映射关系:
Windows 项目目录
⇅
容器 /app
因此:
- 在 VS Code 中修改
main.py,容器立即能看到。 - 容器在
/app创建文件,Windows 项目目录也会出现。 - 修改代码通常不需要重新构建镜像。
--rm 的含义
docker run --rm ...
表示容器停止后自动删除该容器。
它不会删除:
- Docker 镜像
- Windows 项目目录
- bind mount 中的文件
它会删除容器自身文件系统中的临时修改,例如:
/tmp 下的文件
临时 apt install 的软件
未挂载目录中的修改
4. VS Code Dev Containers
仅在终端中进入容器,不代表 VS Code 编辑器本身已经进入容器。
之前的状态是:
VS Code 编辑器:Windows
终端:Docker Linux
因此 Windows VS Code 无法直接使用 Linux 路径:
/app/.venv/bin/python
通过 Dev Containers 连接后:
VS Code
└── Dev Container
├── Python 扩展
├── uv
└── /app/.venv/bin/python
此时可选择解释器:
/app/.venv/bin/python
Dev Containers和Docker两种VS Code扩展区别:
- Dev Containers:用于在容器中开发。
- Docker 扩展:用于查看和管理镜像、容器、网络和日志,可选但有用。
Python扩展需要重新安装到 Dev Container 环境中。
