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

时间:2018-06-22 04:45:21

标签: 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

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"]

1 个答案:

答案 0 :(得分:2)

在评论中总结讨论:

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

构建完成后,由docker-compose.yml中的“ build:。” 触发,docker启动容器并添加一个卷。但这对您来说太迟了。

建议的机制是将 ENTRYPOINT 与用于启动您的内容的密码一起使用。它是在启动阶段的构建后执行的,因此您可以访问该卷。

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