自动摘要
正在生成中……
学习的是vsc官方的教程,这里写一下大致的步骤。
1. 创建开发容器配置
安装 官方的Dev Container扩展
在vsc中打开一个目录,然后 cmd+shift+p
打开命令面板,键入“添加开发容器”
并选择“开发容器: 添加开发容器配置文件”
。这里选 python3,可以在后续选项中选择额外安装的应用。确定后会在当前目录创建一个目录和配置文件,路径是 .devcontainer/devcontainer.json
,我的内容为(额外安装了curl)
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/python
{
"name": "Python 3",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/python:1-3.11-bullseye",
"features": {
"ghcr.io/devcontainers-contrib/features/curl-apt-get:1": {}
}
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "pip3 install --user -r requirements.txt",
// Configure tool-specific properties.
// "customizations": {},
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
这时下文的popup会出现一个提示询问是否要在容器中重新打开,如果没有弹出,或者再次进入这个项目时,可以使用命令面板,选择 “开发容器:在容器中重新打开”
。随后它会去拉取镜像运行容器,时间很漫长。。。
看了一下日志,示例是从mcr.microsoft.com
拉取的python:1-3.11-bullseye
。
docker pull mcr.microsoft.com/devcontainers/python:1-3.11-bullseye
2. 检查和安装依赖
等它完成这一通操作后,Python 环境建立起来了,我好奇docker不是执行完就自动退出了吗?查看一下进程,原来为了防止容器退出,它前台运行一个无限sleep的任务。
当前目录在容器中是位于 /workspace/项目目录名称
打开vsc自带的终端:
#检查python版本
python --version
#安装项目依赖项
pip3 install --user -r requirements.txt
#运行项目
python app.py
这些倒不是必须的,容器和项目不一样,克隆下来的演示项目是Flask的,完成后导航到 http://127.0.0.1:5000,在浏览器中打开项目。我如果开发这类带守护进程的项目,更愿意自己写一个docker-compose.yml,用这种慢得吓人的而且十分笨重devcontainer纯粹是开发python脚本用的
,但是还要学习很多配置文件,烦得很。原因很简单,可以使用多个版本,不会污染本地的python,而且它不会自动退出。这样一来,我的要求好像只是要做一个带无限sleep的python 容器。
3. 打造自己的开发容器(非官方的devcontainer )
由于这玩意还要学习很多配置文件,不是通用的docker配置,那些项只在它的配置文件这里有用,有点浪费时间,我决定做自己的开发容器。说干就干,我本地有一个早前pull下来的python3.09-slim镜像,于是我写了一个docker-container.yml
version: "3"
services:
myapp:
image: python:3.9-slim
volumes:
- ./:/code
command: sh -c "while true; do sleep 5; done"
启动容器后,在vscode打开项目目录,点击编辑器最左下方的开发容器小图标,打开“附加到正在运行的容器”就可以在容器中打开这个项目。
之后在容器中安装好了vscode的python扩展(用于函数和模块跳转、debug等等),我还安装了一个叫 Python Docs
(打开Python官方文档)和一个Python Paste And Indent
(用于粘贴Python代码时保持缩进,快捷键是ctrl+shift+v)的扩展。
这些完成后,我请求chatgpt如何保存容器,我觉得它的回答挺靠谱的 😂:
保存容器的步骤:
-
首先,使用docker ps -a
命令列出当前所有的容器,并找到你要保存的容器的ID或名称。
-
运行以下命令来保存容器为一个新的镜像:
bash
docker commit <container_id_or_name> <new_image_name>
其中,<container_id_or_name>
是要保存的容器的ID或名称,<new_image_name>
是你想要为新镜像指定的名称。
例如:
bash
docker commit my_container my_saved_image
-
容器成功保存为新的镜像后,你可以使用docker images
命令检查新镜像是否创建成功。你将看到新镜像的名称、标签、大小等信息。
现在你可以随时使用新的镜像来创建和运行具有相同状态的容器。使用docker run
命令并指定新的镜像名称即可。
bash
docker run --name my_restored_container <new_image_name>
注意,保存容器并创建新镜像后,新的镜像将独立于原始容器。任何对新镜像所做的更改将不会影响原始容器。
我的命令如下:
docker commit bc4f falconchen/py3.09-slim:arm64
由于我保存的容器名为 falconchen/py3.09-slim:arm64 ,工作目录设置在/code下,所以重新写的可以重复利用的docker-compose.yml 如下:
version: "3"
services:
myapp:
image: falconchen/py3.09-slim:arm64
volumes:
- ./:/code
新建一个项目目录,把上面的yml文件拷贝进去,执行docker compose up -d 启动容器,然后打开当前项目目录,点击左下方的devcontainers小图标,选择连接到运行的容器,在项目目录下新建一个test.py文件。内容如下:
from datetime import datetime
# 获取当前时间
current_time = datetime.now()
# 打印当前时间
print("当前时间:", current_time)
打开vscode的终端,执行
python test.py
可正确打印出时间。
点击vscode左侧的扩展图标,出现的边栏有上下两个面板,上面的是本地安装的扩展,下方的是容器内安装的扩展,可以看到在之前制造容器前的扩展已经被安装上了,不需要重复安装。除了Python Paste And Indent
说明不是所有扩展都支持安装进container的,支持的扩展会在其名称下方显示一个在xxx容器中安装的提示。
一个小技巧:查看当前已经安装的扩展,在扩展栏的搜索框输入:@installed