簡體   English   中英

Docker 容器入口點沒有安裝卷的此類文件錯誤

[英]Docker container entry point no such file error with mounted volume

該映像將應用程序源代碼存儲在 /app 中。 在沒有卷映射的情況下從圖像運行容器時,它工作得很好。

如果我為 /app:/opt/test 設置掛載點,則會出現以下錯誤:

python: can't open file 'run.py': [Errno 2] No such file or directory

我似乎無法弄清楚到底是什么問題。 應用程序源代碼不能直接安裝在一個卷中嗎? 我需要能夠將 /app 目錄掛載到主機並仍然在 /app 或其他替代目錄中運行代碼。

Dockerfile:

FROM python:3.8-slim-buster

RUN mkdir /app

# Install SCIP requirements
RUN apt-get update && apt-get install -y wget libgfortran4 libblas3 liblapack3 libtbb-dev libgsl-dev libboost-all-dev build-essential g++ python-dev autotools-dev libicu-dev build-essential libbz2-dev libgmp3-dev libreadline-dev 
RUN wget https://www.scipopt.org/download/release/SCIPOptSuite-7.0.1-Linux.sh -O scip.sh && chmod +x scip.sh && ./scip.sh --skip-license && mv bin/scip /app/scip

VOLUME ["/app"]
WORKDIR /app

# Install pip requirements
ADD requirements.txt .
RUN python -m pip install -r requirements.txt

ADD . /app

# Switching to a non-root user, please refer to https://aka.ms/vscode-docker-python-user-rights
RUN useradd appuser && chown -R appuser /app
USER appuser

# During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug
ENTRYPOINT ["python", "run.py"]

# Keeps Python from generating .pyc files in the container
ENV PYTHONDONTWRITEBYTECODE 1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED 1

# Hypixel API key
ENV API_KEY key

# Bot Discord token
ENV DISCORD_TOKEN token

如何解決:

只需從您的 Dockerfile 中刪除

VOLUME ["/app"]

解釋:

在復制之前,您正在 Dockerfile 中創建一個未命名的卷。 因此,您的文件添加了ADD. /app ADD. /app沒有保存在您的圖像中,而是保存在您的卷中。

當您在 Dockerfile 中創建一個 VOLUME 時(不是使用docker create volume ),它是未命名的。 這意味着docker為其分配了一個任意名稱(在以下示例中為69e64d18f338whatever)並將數據保存在/var/lib/docker/volumes/69e64d18f338whatever/_data

因此,如果您創建容器docker run而沒有裝載這些數據,您將無法在圖像中找到它。

一些好的做法。

一個好的做法是將 Dockerfile 中的 VOLUMES 用於日志和易失性信息。

如果要使用config,Dockerfile中的VOLUMES也不推薦。 對於配置,最好使用命名卷。

對於用作entrypoint點或command的二進制文件,您應該將它們直接設置在 docker 圖像中,而不是在 docker 卷中。

我認為你的掛載點被顛倒了。

正確的語法是host_folder:container_folder而不是相反。

嘗試掛載/opt/test:/app

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM