×

借助 Visual Studio Code 将 Docker 容器用作开发环境 (但我决定打造自己的docker开发环境)

Falcon 2023-07-12 views:
自动摘要

正在生成中……

学习的是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如何保存容器,我觉得它的回答挺靠谱的 😂:

保存容器的步骤:

  1. 首先,使用docker ps -a命令列出当前所有的容器,并找到你要保存的容器的ID或名称。

  2. 运行以下命令来保存容器为一个新的镜像:

    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
  3. 容器成功保存为新的镜像后,你可以使用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

 

 

本文收录于