python - Docker容器入口点没有安装卷的此类文件错误
问题描述
图像将应用程序源代码存储在 /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
不会保存在您的图像中,而是保存在您的卷中。
当您在 Dockerfile 中创建 VOLUME 时(不使用docker create volume
),它是未命名的。这意味着 docker 为其分配一个任意名称(在以下示例中为 69e64d18f338whatever)并将数据保存在/var/lib/docker/volumes/69e64d18f338whatever/_data
因此,如果您创建容器docker run
而不安装这些数据,您将无法在映像中找到它。
一些好的做法。
一个好的做法是在 Dockerfile 中使用 VOLUMES 来获取日志和易失性信息。
如果要使用 config,也不推荐 Dockerfile 中的 VOLUMES。对于配置,最好使用命名卷。
对于用作entrypoint
或的二进制文件command
,您应该直接在 docker 映像中设置它们,而不是在 docker 卷中。
推荐阅读
- docker - 使用 JDBC 输入插件在 Docker 上的 Logstash 不会从 SQL Server 获取所有行
- flutter - 如何突出显示我在字符串中搜索的确切单词,而不仅仅是字符串的开头?
- flutter - 如何实时获取文档长度
- javascript - Reactjs 从获取请求中返回一个对象
- javascript - Nginx 正在尝试打开文件而不是重定向到代理
- python - _joint_log_likelihood 给我错误的值
- sql - 如何按日期获取最后一件商品的价格
- python-3.x - 定期执行功能而不停止其他操作
- r - 使用 R 从 PDF 表单到数据框的文本挖掘
- r - 如果 r 中出现错误,则转到 lapply() 的下一次迭代