我是在 Linux 上作業的新手。如果這是一個愚蠢的問題,我很抱歉。盡管搜索了一個多星期,但我無法對我的問題得出明確的答案。
我在 Nvidia CPU 上運行了一個很長的 Python 程式。輸出是幾個 csv 檔案。計算輸出需要很長時間,所以我曾經nohup能夠退出該程序。
假設main.py檔案是這個
import numpy as p
import pandas as pd
if __name__ == ‘__main__’:
a = np.arange(1,1000)
data = a*2
filename = ‘results.csv’
output = pd.DataFrame(data, columns = [“Output”])
output.to_csv(filename)
data當然,計算更復雜。我構建了一個 docker 容器,并在這個容器中運行這個程式。當我python main.py用于較小尺寸的示例時,沒有問題。它寫入 csv 檔案。
我的問題是這樣的:
當我這樣做時
nohup python main.py &,我會檢查tail -f nohup.outdocker 容器中發生了什么,我知道它當時在做什么,但我無法退出它并讓執行運行。它就停在那里。如何安全退出自帶的螢屏tail -f nohup.out?我嘗試不檢查代碼的狀況并讓代碼繼續執行兩天,然后我回傳了。的輸出
tail -f nohup.out表明執行已完成,但 csv 檔案無處可見。它以某種方式捆綁在里面nohup.out還是表明其他地方出了問題?
uj5u.com熱心網友回復:
如果您要在 Docker 容器中運行此設定:
一個 Docker 容器只運行一個行程,作為前臺行程;當該行程退出時,容器完成。該行程幾乎總是您嘗試運行的腳本或服務器,而不是互動式 shell。但;
可以使用 Docker 構造在后臺運行容器本身,并在容器運行時或完成后收集其日志。
像這樣的 Python 程式的典型 Dockerfile 可能如下所示:
FROM python:3.10
# Create and use some directory; it can be anything, but do
# create _some_ directory.
WORKDIR /app
# Install Python dependencies as a separate step. Doing this first
# saves time if you repeat `docker build` without changing the
# requirements list.
COPY requirements.txt .
RUN pip install -r requirements.txt
# Copy in the rest of the application.
COPY . .
# Set the main container command to be the script.
CMD ["./main.py"]
該腳本應該是可執行的(chmod x main.py在您的主機上)并以“shebang”行(#!/usr/bin/env python3)開頭,以便系統知道在哪里可以找到解釋器。
您將聽到同時使用CMD和ENTRYPOINT用于最后一行的建議。這對你的直接問題無關緊要。我更喜歡CMD有兩個原因:啟動替代命令來除錯容器(docker run --rm your-image ls -lvs. docker run --rm --entrypoint ls your-image -l)更容易,并且有一個非常有用的模式ENTRYPOINT用于進行一些初始設定(動態創建環境變數,運行資料庫遷移,......)和然后啟動CMD。
構建映像后,您可以使用該docker run -d選項在后臺啟動它,然后運行docker logs以查看它的結果。
# Build the image.
docker build -t long-python-program .
# Run it, in the background.
docker run -d --name run1 long-python-program
# Review its logs.
docker logs run1
如果您運行它來生成需要從主機讀回的檔案,則需要在啟動容器時將主機目錄掛載到容器中。您需要進行一些更改才能成功執行此操作。
在您的代碼中,您需要將結果寫入與應用程式代碼不同的位置。您不能在目錄上掛載主機目錄,/app因為它會隱藏您實際嘗試運行的代碼。
data_dir = os.getenv('DATA_DIR', 'data')
filename = os.path.join(data_dir, 'results.csv')
或者,在您的 Dockerfile 中,創建此目錄并設定指向它的指標。由于我的示例代碼從環境變數中獲取其位置,因此您可以再次使用您想要的任何路徑。
# Create the data directory.
RUN mkdir /data
ENV DATA_DIR=/data
當您啟動容器時,該docker run -v選項會將檔案系統掛載到容器中。對于這種輸出檔案,您正在尋找直接將主機目錄附加到容器的系結掛載。
docker run -d --name run2 \
-v "$PWD/results:/data" \
long-python-program
在這個例子中,到目前為止我們還沒有設定USER程式的,它將以root身份運行。您可以更改 Dockerfile 以設定備用USER(這是一個很好的做法);chown除了該data用戶擁有的目錄之外,您不需要任何其他東西(讓您的代碼由 root 擁有并且不可全域寫入也是一種好習慣)。如果這樣做,當您啟動容器時(在本機 Linux 上),您需要提供可以寫入主機目錄的主機數字用戶 ID;您不需要在 Dockerfile 中進行其他更改。
docker run -d --name run2 \
-u $(id -u) \
-v "$PWD/results:/data" \
long-python-program
uj5u.com熱心網友回復:
1-容器是一個前臺行程。使用CMD或Entrypoint在Dockerfile.
2- 將 docker 中的卷映射到 linux 目錄。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/406542.html
標籤:
