Python 2.7 開發環境設置

Python 軟體基金會(Python Software Foundation)已在 2020/01/1,正式終止對 Python 2.7 的支援。那要如何在本地環境,進行基於 Python 2.7 的專案維護或開發呢?第一個想到的就是使用自製的 docker image。爬文找到這篇 Setting Up a Python Remote Interpreter Using Docker ,可以用 VS code 跟 PyCharm 進行搭配 Python 2.7 的 docker image 進行開發👍。

環境 Environment

  • macOS 12.3.1
  • Docker version 20.10.12, build e91ed57
  • Task version: v3.12.0 (h1:viFy8kdDZ2iTcpTuxzzJCeKtTGt9U+5iXMVIpLjvIro=)

事情準備

開始動手前,先準備好一下檔案。以下檔案都放在 Git repository: jerry771230/my-py2.7-dev

Dockerfile 內容,

  1. 只安裝必要的 packages
  2. 建立 root 的密碼
  3. 設定可以通過 SSH 以帳號密碼登入
  4. 啟動 ssh 服務
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM python:2.7-slim-buster

RUN apt-get update && \
apt-get install -y gcc file make libcurl4-openssl-dev libssl-dev openssh-server curl wget && \
apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \
rm -rf /var/lib/apt/lists/* && \
mkdir -p /srv

RUN echo 'root:password' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
# RUN mkdir /run/sshd
RUN service ssh start
EXPOSE 22
EXPOSE 8787
CMD ["/usr/sbin/sshd", "-D"]

備註:
在文件 Develop on a remote Docker host 內有提到,VS code 可以使用 SSH 登入 container 進行開發。如果不需要 SSH 登入,其相關 packages 跟服務是都不需要的。

Taskfile.yml 後續指令都是使用 task 來執行,

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
31
32
33
34
35
36
37
38
39
40
41
version: "3"

tasks:
build:
desc: Build "py2.7-dev" image
cmds:
- docker build -t py2.7-dev .

down:
desc: Remove containers
cmds:
- docker-compose down

up:
desc: Run containers
cmds:
- docker-compose up -d

exec:
desc: Get into "py2.7" container
cmds:
- docker exec -ti py2.7 /bin/bash
stop:
desc: Stop containers
cmds:
- docker-compose stop

start:
desc: Start containers
cmds:
- docker-compose start

restart:
desc: Restart containers
cmds:
- docker-compose restart

login:
desc: SSH to "py2.7" container
cmds:
- ssh -p 2222 -t root@127.0.0.1 'cd /srv ; bash'

基礎的 Python 2.7 docker image 建立後,就可以使用 docker-compose 進行操作, docker-compose.yml 如下,

1
2
3
4
5
6
7
8
9
10
11
12
version: "3.7"
services:
py:
image: py2.7-dev:latest
container_name: py2.7
tty: true
ports:
- "8787:8787"
- "2222:22"
working_dir: /srv
volumes:
- ./code:/srv

Python 2.7 專案需要安裝的 packages 就靠 code\requirement.txt 管理了,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Flask
flask_restful
flask-httpauth==4.5.0
zerorpc
urllib3
strgen
requests
psycopg2-binary
flask_sqlalchemy
bcrypt
ping
psutil
pyjwt
pyOpenSSL
python-dateutil
flask-migrate

開始製作專案用 Python 2.7 docker image

1. 建立 “py2.7-dev” docker image

1
task build

建立完成後, 列出 “py2.7-dev” docker image,

1
2
3
docker images | grep py2.7

py2.7-dev latest 10e84e2626e0 9 seconds ago 329MB

2. 運行 container

使用剛才建立的 docker image py2.7-dev:latest 來運行 container

1
task up

顯示已運行的 containers

1
2
3
4
docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8dc4ba33f2e py2.7-dev:latest "/usr/sbin/sshd -D" 5 seconds ago Up 3 seconds 0.0.0.0:8787->8787/tcp, 0.0.0.0:2222->22/tcp py2.7

3. SSH to container

使用 SSH 命令登入 “py2.7” container,

1
task login

此時需要輸入密碼才能登入。

可以使用 authorized_key 進行 SSH 登入,這樣就可以免除輸入密碼。使用下方命令,將 key 複製到 container,

1
ssh-copy-id -p 2222 root@127.0.0.1

完成後再次使用 SSH 命令登入,此時不需要密碼就可以登入 container 內。

1
task login

4. Docker 命令進入 container

在沒有安裝及設定 SSH 前,使用 docker exec 可以直接進入 container。

1
task exec

備註:
沒有特別需求時,使用 docker execSSH 方便,也不需要安裝 SSH 相關的 packages(佔空間)。

5. 安裝 Python 專案需要的 packages

在進入 container 後,執行下列命令,

1
2
3
4
cd /srv &&\
pip install pip -U &&\
pip install pycurl -U &&\
pip install -r ./requirement.txt

完成後離開 container,

1
exit

6. 提交(Commit)修改到 image

列出運行中的 container,

1
2
3
4
docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8dc4ba33f2e py2.7-dev:latest "/usr/sbin/sshd -D" 2 minutes ago Up 2 minutes 0.0.0.0:8787->8787/tcp, 0.0.0.0:2222->22/tcp py2.7

將 container NAMES 為 ‘py2.7’ 的 CONTAINER ID 複製起來。

使用 docker commit 將修改內容建立成新的 docker image。以下是命令的語法,

1
docker commit [CONTAINER ID] [new_image_name]

執行下列命令,將建立新的 docker image 命名成 my-py2.7-dev

1
docker commit f8dc4ba33f2e my-py2.7-dev

完成後,列出 docker images,可以看到 my-py2.7-dev image 的容量長大了不少 :)

1
2
3
4
docker images | grep py2.7

my-py2.7-dev latest cd7c2ab0d9b3 6 seconds ago 453MB
py2.7-dev latest 10e84e2626e0 16 minutes ago 329MB

7. 使用新的 image

先移除運行中的 container,

1
task down

修改 docker-compose.yml,將 ‘services > py > image: py2.7-dev:latest’ 改成剛才建立的 ‘image: my-py2.7-dev:latest’。

1
2
3
4
services:
py:
# image: py2.7-dev:latest
image: my-py2.7-dev:latest

再次運行 container,

1
task up

列出運行中的 container,

1
2
3
4
docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f462db97314f my-py2.7-dev:latest "/usr/sbin/sshd -D" About a minute ago Up About a minute 0.0.0.0:8787->8787/tcp, 0.0.0.0:2222->22/tcp py2.7

以上步驟完成後,就可以依賴 docker image - ‘my-py2.7-dev:latest’,來設定 VS code 或 PyCharm 以 docker container 進行 Python 2.7 的開發(希望如此 XD)。


其他好用的 docker 命令

Get IP Address of container

1
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' py2.7

Use docker command to run container

1
2
3
4
5
6
7
docker run -td --name py2.7 \
-p "8787:8787" \
-p "2222:22" \
-v $PWD:/srv \
-w /srv \
my-py2.7-dev:latest

參考資料 References