Docker compose не копирует файлы - PullRequest
0 голосов
/ 25 мая 2019

Довольно просто: приведенная ниже конфигурация docker-compose не позволяет файлам сохраняться после запуска. Поэтому, когда я делаю docker exec -i -t aas-job-hunter_web_1 ls /app -alt, я ничего не вижу.

Вот (не) работающий минимальный пример: https://github.com/philastrophist/test-docker

Я в Windows 10, я разрешил подключенные диски и включил соединение TLS. Я не уверен, что еще делать. Меня больше всего смущает то, что requirements.txt явно скопировано (поскольку оно все устанавливает), но его нет, когда я смотрю docker exec.

Моя структура каталогов:

parent/
    website/
        manage.py
        ...
    Dockerfile
    docker-compose.yml
    ...

Dockerfile:

FROM python:3.6

#WORKDIR /app

# By copying over requirements first, we make sure that Docker will cache
# our installed requirements rather than reinstall them on every build
COPY requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt

# Now copy in our code, and run it
COPY . /app
EXPOSE 8000
CMD python website/manage.py runserver 0.0.0.0:8000
# CMD tail -f /dev/null # use when testing

докер-compose.yml:

version: '2'
services:
  web:
    build: .
    ports:
     - "8000:8000"
    volumes:
     - .:/app
    links:
     - db

  db:
    image: "postgres:9.6"
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: hunter2

Traceback:

> docker-compose -f docker-compose.yml up --build
Building web
Step 1/6 : FROM python:3.6
 ---> 0668df180a32
Step 2/6 : COPY requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 3073d0bef876
Step 3/6 : RUN pip install -r /app/requirements.txt
 ---> Using cache
 ---> 8ad63bbb3de5
Step 4/6 : COPY . /app
 ---> 16390cdd6c2c
Step 5/6 : EXPOSE 8000
 ---> Running in f628000e8961
Removing intermediate container f628000e8961
 ---> 80e6994cfbd2
Step 6/6 : CMD python website/manage.py runserver 0.0.0.0:8000
 ---> Running in acb6b25eb558
Removing intermediate container acb6b25eb558
 ---> da8876d78103
Successfully built da8876d78103
Successfully tagged aas-job-hunter_web:latest
Starting aas-job-hunter_db_1 ... done
Recreating aas-job-hunter_web_1 ... done
Attaching to aas-job-hunter_db_1, aas-job-hunter_web_1
db_1   | LOG:  database system was shut down at 2019-05-24 21:23:31 UTC
db_1   | LOG:  MultiXact member wraparound protections are now enabled
db_1   | LOG:  database system is ready to accept connections
web_1  | python: can't open file 'website/manage.py': [Errno 2] No such file or directory
aas-job-hunter_web_1 exited with code 2

Ответы [ 3 ]

1 голос
/ 25 мая 2019

На самом деле он копирует файлы.

  1. Решение 1

Измените CMD на:

CMD python /app/website/manage.py runserver 0.0.0.0:8000
Решение 2

Вы вызываете WORKDIR до создания папки /app.Поэтому измените ваш Dockerfile на:

FROM python:3.6.2

# By copying over requirements first, we make sure that Docker will cache
# our installed requirements rather than reinstall them on every build
COPY requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt

# Now copy in our code, and run it
COPY . /app
WORKDIR /app
#EXPOSE 8000
CMD python ./website/manage.py runserver 0.0.0.0:8000
# CMD tail -f /dev/null # use when testing

И назовите его после.

Кроме того, помните, что в вашем текущем файле docker-compose вы используете привязки, а не тома, поэтому контекст - . будет полностью заменять содержимое /app в вашем контейнере.

0 голосов
/ 25 мая 2019

Раскомментировать #WORKDIR /app.Я также немного очистил другие части, чтобы использовать WORKDIR more.

FROM python:3.6
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD python website/manage.py runserver 0.0.0.0:8000
0 голосов
/ 25 мая 2019

Я думаю, что нет ничего плохого в COPY. Но вам нужно установить рабочий каталог на /app, так как ваш manage.py файл находится внутри /app/website, а не в /website внутри Docker.

Итак, я думаю, что ваш Dockerfile должен быть таким:

FROM python:3.6

RUN mkdir /app

COPY requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt

COPY . /app
WORKDIR /app

EXPOSE 8000
CMD python website/manage.py runserver 0.0.0.0:8000
...