docker-compose:使用 Dockerfile 中卷中的文件

Lig*_*244 2 docker docker-compose

我在 docker-compose.yml 中定义了一个卷。我想使用 Dockerfile 中卷中的这些文件之一,但收到错误:“没有这样的文件或目录”

如果我创建容器时无法访问 Dockerfile 中的文件,我将在 docker-compose.yml 文件的特定位置看到容器内卷中的所有文件。

这是它应该如何工作还是我做错了什么?我想我错过了一些东西。

存储库: https: //github.com/Lightshadow244/OwnMusicWeb

docker-compose.yml:

version: '3'
services:
  ownmusicweb:
   build: .
   container_name: ownmusicweb
   hostname: ownmusicweb
   volumes:
       - ~/OwnMusicWeb/ownmusicweb:/ownmusicweb
   ports:
    - 83:8000
   tty: true
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM ubuntu:latest
WORKDIR /ownmusicweb
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "python-pip"]
RUN ["pip", "install", "--upgrade", "pip"]
RUN ["pip", "install", "Django", "eyeD3", "djangorestframework", "markdown", "django-filter"]
RUN ["python", "/ownmusicweb/manage.py", "migrate"]
RUN ["python", "/ownmusicweb/manage.py", "runserver", "0.0.0.0:8000"]
Run Code Online (Sandbox Code Playgroud)

Inn*_*ndo 5

总结评论中的讨论:

RUN指令无法访问卷,因为它尚未安装。Docker 仅创建构建上下文,这是使用 ADD 指令所必需的。但通过这种方式,文件将保留在已编译的容器中,因此您将需要重建来更新这些文件。

构建完成后,由“build:”触发。在 docker-compose.yml 中,docker 启动容器并添加卷。但就你的情况来说已经太晚了。

建议的机制是使用ENTRYPOINT和 scipt 来启动你的东西。它在启动阶段的构建之后执行,因此您可以访问该卷。

另一种方法,在我看来更干净一些,是使用docker-compose 的命令指令。您可以将相同的脚本放入其中。这取决于您进行部署的方式以及在开发环境中使用 docker 的方式。