# 包含Node.js、Node-Red與Python的Docker File
---
## Docker File
----
## 穩定版
```dockerfile=
# 使用官方Node.js映像作為基礎映像
FROM node:latest
# 更新系統並安裝所需軟件包
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
python3-venv \
&& rm -rf /var/lib/apt/lists/*
# 創建Python虛擬環境
RUN python3 -m venv /opt/venv
# 激活虛擬環境並安裝Jupyter
RUN . /opt/venv/bin/activate && pip install --no-cache-dir jupyter
# 使用npm安裝最新版本的Node-RED
RUN npm install -g --unsafe-perm node-red@latest
# 設定資料存放位置環境變量,以供後續掛載存儲卷使用
ENV JUPYTER_DATA_DIR=/data/jupyter_data
ENV NODE_RED_DATA_DIR=/data/node_red_data
# 創建Jupyter和Node-RED資料存放目錄
RUN mkdir -p $JUPYTER_DATA_DIR $NODE_RED_DATA_DIR
# 暴露Jupyter Notebook和Node-RED所需端口,分別為8888和1880
EXPOSE 8888 1880
```
----
### 差異
在最新版本的 Debian 和 Ubuntu 系統中,為了避免系統範圍內的 Python 包管理問題,系統管理員被鼓勵使用系統包管理器(如 apt)來安裝 Python 軟件包。這是因為直接使用 pip 安裝全局包可能會與 apt 管理的包產生衝突,導致依賴關係混亂或系統損壞。
並且讓Docker File盡量簡化,將要執行的指令移到Docker Compose來處理
----
### 處理方式
所以我們可以試著在 Docker 容器內創建並使用 Python 虛擬環境,然後在該環境中使用 pip 安裝包。這樣既避免了修改系統 Python 環境,也避免了可能的依賴衝突。
----
### 放入檔案
如果要放入檔案,不要由本機電腦放入,盡量用網路下載,避免依賴build環境
例如在指定port前加入以下指令
```dockerfile=
# 下載特定文件到/app目錄
RUN curl -o /app/TestFile https://huamau1.myDS.me:26001/TestFile &&\
curl -o /app/TestFile2 https://huamau1.myDS.me:26001/TestFile2
```
----
### 放入requirements.txt
```dockerfile=
# 使用官方Node.js映像作為基礎映像
FROM node:latest
# 更新系統並安裝所需軟件包
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
python3-venv \
&& rm -rf /var/lib/apt/lists/*
# 創建Python虛擬環境
RUN python3 -m venv /opt/venv
#下載requirements.txt
RUN curl -o /opt/venv/requirements.txt https://gist.githubusercontent.com/kent1026/a1f44466b064a523463aaa70b9a8d1a9/raw/068e5d06510153ea6f7dcc75e861dd9475bf4086/requirements.txt
# 激活虛擬環境並安裝Jupyter與requirements.txt 中列出的依賴
RUN . /opt/venv/bin/activate && pip install --no-cache-dir jupyter && pip install --no-cache-dir -r /opt/venv/requirements.txt
# 使用npm安裝最新版本的Node-RED
RUN npm install -g --unsafe-perm node-red@latest
# 設定資料存放位置環境變量,以供後續掛載存儲卷使用
ENV JUPYTER_DATA_DIR=/data/jupyter_data
ENV NODE_RED_DATA_DIR=/data/node_red_data
# 創建Jupyter和Node-RED資料存放目錄
RUN mkdir -p $JUPYTER_DATA_DIR $NODE_RED_DATA_DIR
# 創建 /app 目錄
RUN mkdir -p /app
# 下載 app.py 文件
RUN curl -o /app/app.py https://gist.githubusercontent.com/kent1026/e7f70eb657279237a07bc85797c6047f/raw/951228ef74c5aa30777a11e0f726426140c22485/app.py
CMD . /opt/venv/bin/activate && jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root --notebook-dir=/data/jupyter_data & . /opt/venv/bin/activate && python /app/app.py & node-red --userDir /data/node_red_data
# 暴露Jupyter Notebook和Node-RED所需端口,分別為8888和1880
EXPOSE 8888 1880 5000
```
---
## Docker Compose
```yaml=
version: "3.9"
services:
node16-python-node-red-test:
image: python-node-red-test:v1
ports:
- "18888:8888" # Jupyter Notebook
- "11880:1880" # Node-RED
- "15000:5000" # 假設 Flask 應用的端口
volumes:
- jupyter_data:/data/jupyter_data
- node_red_data:/data/node_red_data
- "d:/soft/docker:/app" # 將本機 d:/soft/docker 與容器中的 /app 目錄同步
#將啟動的指令換到docker compose來處理,比較靈活且容易排錯
command: /bin/sh -c ". /opt/venv/bin/activate && jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root --notebook-dir=/data/jupyter_data & . /opt/venv/bin/activate && python /app/app.py & node-red --userDir /data/node_red_data"
filebrowser:
image: filebrowser/filebrowser:latest
ports:
- "11980:80"
volumes:
- jupyter_data:/srv/jupyter_data
- node_red_data:/srv/node_red_data
- filebrowser_data:/config
- "d:/soft/docker:/app" # 同樣,為 filebrowser 服務添加文件同步
command: ["--root", "/"] # 讓filebrowser可以看到容器內的檔案
volumes:
jupyter_data:
node_red_data:
filebrowser_data:
```
----
### 差異
這裡將大多的設定與指令移到Docker Compose這裡來處理,一來可以簡化Docker File,二來有任何修改可以直接Deploy,不用重新Build Image,三來沒有Docker File就難以被直接使用。
這在發Docker Hub上是缺點,但是在公司內開發是比較方便且安全的方式
---
## Image
[穩定版](https://huamau1.myDS.me:26001/sharing/QBPlcVg5s)
[有requirements](https://huamau1.myDS.me:26001/sharing/rA38R6kxt)
密碼:8rgHC8a2fDV8HL
存活時間:2024/04/11~2024/04/18
{"title":"包含Node.js、Node-Red與Python的Docker File","slideOptions":"{\"transition\":\"slide\",\"spotlight\":{\"enabled\":false}}","contributors":"[{\"id\":\"388c4bf6-8beb-45c5-8632-2fb50296a8c5\",\"add\":13542,\"del\":9007}]","description":"在最新版本的 Debian 和 Ubuntu 系統中,為了避免系統範圍內的 Python 包管理問題,系統管理員被鼓勵使用系統包管理器(如 apt)來安裝 Python 軟件包。這是因為直接使用 pip 安裝全局包可能會與 apt 管理的包產生衝突,導致依賴關係混亂或系統損壞。"}