# 包含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 管理的包產生衝突,導致依賴關係混亂或系統損壞。"}
    236 views