使用Docker打包VSCode开发环境
最近开始有大量需要用到linux的开发环境的课,但是又不想给我的主力台式机装上Debian,便想要找一种方式可以远程一个linux进行开发。通常linux支持的VNC作为开发严重受限于网络质量,并且延迟较高,遂放弃。于是选择使用VSCode链接远程服务器的SSH作为开发环境。同时docker可以轻松切换各种开发环境而不影响宿主机。
服务器配置
最近刚好买了台搭载Intel N100 CPU的微型机作为一个微型服务器。功耗及声音极低,非常适合放在房间里挂一些服务。配置如下:
- CPU: Intel N100
- RAM: 16GB LPDDR5
- SSD: 256GB
- NIC: 2x 1000Mbps Ethernet
这个配置作为个人微型服务器非常合适,并且具有双网口,有需要也可以做软路由。
这里不是广告
Dockerfile
最重要的一步就是完成Dockerfile,可以参考如下配置:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31FROM python:3.11.5-bookworm as builder-image
ARG SSH_PASSWORD
ARG SSH_PUBLIC_KEY
COPY requirements.txt .
RUN pip install --default-timeout=1000 --no-cache-dir -r requirements.txt
WORKDIR ./app
COPY . .
RUN apt-get update -y \
&& apt-get install -y libaio1 vim nano openssh-server locales
RUN echo "root:${SSH_PASSWORD}" | chpasswd
RUN echo "${SSH_PUBLIC_KEY}" >> /root/.ssh/authorized_keys
RUN chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen
# Set environment variables for the locale for haskell
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
EXPOSE 8088 22
CMD service ssh restart && tail -f > /dev/null
并且目录结构如下1
2
3
4
5WorkingFolder
├─ Dockerfile
├─ requirements.txt
├─ docker
└─sshd_config
- python:3.11.5-bookworm: 基础镜像,可以选择自己需要的开发环境作为基础镜像。这里使用的是Python3.11.5 + Debian 12.
- requirements.txt: Python需要安装的包,根据自己的需要添加
- sshd_config: SSHD 的配置文件,可以从自己的linux机器中copy出来。
- 安装软件: 可以在
apt-get install
后面添加需要安装的包。
打包Docker
使用如下命令可以打包docker1
docker build --build-arg SSH_PASSWORD=${{ secrets.SSH_PASSWORD }} --build-arg SSH_PUBLIC_KEY="${{ secrets.SSH_PUBLIC_KEY }}" -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.REPO_NAME }}:latest .
- secrets.SSH_PASSWORD: 想要使用的ssh密码
- secrets.SSH_PUBLIC_KEY:想要使用的SSH公钥证书
- secrets.DOCKERHUB_USERNAME: DockerHUB 用户名(如果不需要这里可以删掉)
- secrets.REPO_NAME:DockerHub 仓库名称
- latest:可以替换成你想要的Tag
注意这里最后一个点,这个不可省略,表示构建当前目录
如果只需要本地build和运行,${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.REPO_NAME }}:latest
这一部分可以换成 <image-name>:<tag>
。
运行Docker
创建持久化Volume:1
docker volume create --name <volume-name>
运行Docker:1
docker run -d -v <volume-name>:/root -p 8022:22 <image-name>:<tag>
自行替换缺失部分
由于已经生成了ssh密码以及公钥证书,可以直接通过证书进行ssh链接
VSCode 配置
打开VSCode,安装Remote SSH
插件
从最左侧任务栏中间打开Remote菜单, 点击设置按钮
点击第一个配置文件
在尾端加上如下配置1
2
3
4
5
6Host Docker-Python-3.11
HostName 192.168.10.5
User root
Port 10001
PreferredAuthentications publickey
IdentityFile "D:\ssh_keys\dockerssh"
根据个人配置修改IP,端口,用户以及证书
VSCode只能使用证书才能不用每次登录输入密码。如果使用密码SSH,每次链接需要输入密码
SSH 密钥权限
存放在客户端的私钥VSCode要求严格的权限控制
对于Linux用户,可以执行以下命令1
chmod 400 ~/.ssh/<private_key>
对于Windows用户,可以使用如下Powershell脚本1
icacls "privateKeyPath" /grant :R
注意替换路径
然后在Windows资源管理器中导航到私钥文件,右键单击并选择属性。选择安全性选项卡> 高级> 禁用继承> 从此对象中删除所有继承的权限。
Done
至此基本操作均已完成,可以在VSCode中间使用terminal执行命令。并且可以安装许多VSCode插件。
同时也可以上传到Github,并且配置Github Actions进行自动构建。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28name: Docker Build and Push
on:
push:
branches:
- main # Trigger the workflow on push to the main branch
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build Docker image
run: |
docker build --build-arg SSH_PASSWORD=${{ secrets.SSH_PASSWORD }} --build-arg SSH_PUBLIC_KEY="${{ secrets.SSH_PUBLIC_KEY }}" -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.REPO_NAME }}:latest .
- name: Push Docker image
run: |
docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.REPO_NAME }}:latest
此脚本会自动上传到DockerHub。注意配置Github Variables。
可以按照自己需求上传到 Github registry 或者其他 Docker 仓库管理。
具体可以参考仓库:此处