Команда COPY не выполнена - PullRequest
1 голос
/ 21 марта 2019

Застрял в этом за последние 3 дня. Я строю образ в докере и Команда copy завершается неудачно из-за того, что не найдено нужного каталога.

FROM python:3.6.7-alpine

WORKDIR /usr/src/app

COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip3 install -r requirements.txt

COPY . /usr/src/app

CMD python3 manage.py run -h 0.0.0.0

, который запускается этим файлом docker-dev:

version: '3.7'

services:

  users:
    build:
      context: ./services/users
      dockerfile: Dockerfile-dev
  volumes:
    - './services/users:/usr/src/app'
  ports:
    - 5001:5000
  environment:
    - FLASK_APP=project/__init__.py
    - FLASK_ENV=development

и получаю эту ошибку:

Building users
Step 1/6 : FROM python:3.6.7-alpine
 ---> cb04a359db13
Step 2/6 : WORKDIR /usr/src/app
 ---> Using cache
 ---> 06bb39a49444
Step 3/6 : COPY ./requirements.txt /usr/src/app/requirements.txt
ERROR: Service 'users' failed to build: COPY failed: stat /var/snap/docker/common/var-lib-docker/tmp/docker-builder353668631/requirements.txt: no such file or directory

Я даже не знаю, с чего начать с отладки. Когда я попытался получить доступ к каталогу, это дало мне ошибку разрешения. Поэтому я попытался запустить команду с sudo, которая не помогла. Есть мысли?

Ответы [ 3 ]

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

У меня была похожая проблема при создании образа с бериллием, и я решил эту проблему, удалив его в .dockerignore

$ sudo docker build -t apache .

Отправка контекста сборки в демон Docker

10.55MB Step 1/4 : FROM centos  ---> 9f38484d220f Step 2/4 :

RUN yum install httpd -y 

---> Using cache  ---> ccdafc4ae476 Step 3/4 : 

**COPY ./**beryllium** /var/www/html COPY failed: stat /var/snap/docker/common/var-lib-docker/tmp/docker-builder04301** 

$ nano.dockerignore

startbootstrap-freelancer-master

run.sh

pro

fruit

beryllium

Bell.zip

удалить бериллий из этого файла


$ sudo docker build -t apache .
Sending build context to Docker daemon  12.92MB

Step 1/4 : FROM centos

 ---> 9f38484d220f

Step 2/4 : RUN yum install httpd -y

 ---> Using cache

 ---> ccdafc4ae476

Step 3/4 : COPY ./beryllium /var/www/HTML

 ---> 40ebc02992a9

Step 4/4 : CMD apachectl -DFOREGROUND

 ---> Running in dab0a406c89e

Removing intermediate container dab0a406c89e

 ---> 1bea741cfb65

Successfully built 1bea741cfb65

Successfully tagged apache:latest
0 голосов
/ 18 мая 2019

Как подсказывает larsks в своем комментарии , вам нужен файл в каталоге services/users.Чтобы понять почему, полезно понимание «контекста».

Docker не строит на клиенте, он не видит ваш текущий каталог или другие файлы в вашей файловой системе.Вместо этого последний аргумент команды сборки передается как контекст сборки.При использовании docker-compose этот контекст по умолчанию соответствует текущему каталогу, который вы часто будете видеть как . в команде docker build, но вы можете переопределить это, как вы сделали здесь с ./services/users в качестве контекста.Когда вы запускаете сборку, самым первым шагом является отправка этого контекста сборки с док-клиента на сервер.Даже когда клиент и сервер находятся на одном и том же хосте (обычное значение по умолчанию, особенно для настольных сред), происходит такой же процесс.Файлы, перечисленные в .dockerignore, и файлы в родительских каталогах в контексте сборки не отправляются на сервер Docker.

Когда вы запускаете команду COPY или ADD, первый аргумент (или все, кромепоследний аргумент (если у вас их несколько) относится к файлам из контекста сборки, а последний аргумент - это целевой файл или каталог внутри изображения.


Поэтому, когда вы собираете эту запись составного файла:

build:
  context: ./services/users
  dockerfile: Dockerfile-dev

с помощью этой команды COPY:

COPY ./requirements.txt /usr/src/app/requirements.txt

COPY попытается скопировать файл requirements.txt из контекста сборки, сгенерированного из ./services/users, то есть ./services/users/requirements.txt необходимосуществует и не может быть исключен файлом .dockerignore в ./services/users.

0 голосов
/ 28 марта 2019

Немного поздно, чтобы ответить, но вторая команда COPY COPY . /usr/src/app заменяет содержимое / usr / src / app, сгенерированное RUN pip3 install -r requirements.txt.

Попробуйте

FROM python:3.6.7-alpine

WORKDIR /usr/src/app

# install in temp directory
RUN mkdir /dependencies

COPY ./requirements.txt /dependencies/requirements.txt
RUN cd /dependencies && pip3 install -r requirements.txt

COPY . /usr/src/app

# copy generated dependencies
RUN cp -r /dependencies/* /usr/src/app/

CMD python3 manage.py run -h 0.0.0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...