【问题标题】:Docker-compose build error with django and mysqlDocker-compose 使用 django 和 mysql 构建错误
【发布时间】:2021-03-11 08:15:21
【问题描述】:

我试图用 docker-compose 和 MySQL 构建一个 Django 项目,但是当我运行“docker”时

db uses an image, skipping
Building with native build. Learn about native build in Compose here:
Building web
Sending build context to Docker daemon  22.02kB
Step 6/6 : COPY . /code/
 ---> 2f42d48fb668
Successfully built 2f42d48fb668
Successfully tagged djangonew_web:latest
Traceback (most recent call last):
  File "docker-compose", line 3, in <module>
  File "compose/cli/main.py", line 80, in main
  File "compose/cli/main.py", line 192, in perform_command
  File "compose/metrics/decorator.py", line 18, in wrapper
  File "compose/cli/main.py", line 369, in build
  File "compose/project.py", line 521, in build
  File "compose/project.py", line 503, in build_service
  File "compose/service.py", line 1131, in build
  File "compose/progress_stream.py", line 22, in stream_output
  File "compose/utils.py", line 50, in split_buffer
  File "compose/utils.py", line 26, in stream_as_text
  File "compose/service.py", line 1894, in build
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/tmpjwyh07ql'
[16684] Failed to execute script docker-compose

我的 Dockerfile:

FROM python:3
ENV PYTHONBUFFERD=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

我的 docker-compose.yml 文件:

version: "3.9"

services:
  db:
    image: mysql
    environment:
      - MYSQL_DB=mysql_test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
      - MYSQL_ROOT_PASSWORD=test
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000" 
    depends_on:
      - db

这是一个如此神秘的错误,我现在真的不知道该去哪里。如果有人可以帮助我,我会很高兴。

谢谢!

【问题讨论】:

  • 你运行了什么命令?使用 docker-compose up;而不是 docker-compose build
  • 两者都会抛出同样的错误。

标签: django docker docker-compose dockerfile


【解决方案1】:

避免使用像.(点)这样的包罗万象的模式来复制整个工作目录。

首先,这对于运行它的每个环境都会有所不同,因为它包括所有隐藏和本地文件,而不仅仅是您期望的那些(例如,由您的版本系统跟踪的那些)。

其次,可能存在指向其他目录的链接,因此您甚至可能最终复制了很多您绝对不想在 Dockerfile 中包含的内容。这很可能是您的情况。

.dockerignore 是一种防止复制过多的方法,但您也应该尝试更明确地复制。这也将帮助其他人了解您希望通过 Dockerfile 中的特定 COPY 命令实现什么。

tl;dr: 生成的 docker 映像应该只包含它需要运行的内容,并且只有在有意更改时才应该更改(包含任何不同的内容)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多