COPY命令失败

时间:2019-03-21 20:26:51

标签: docker dockerfile

在过去的3天里一直坚持下去。我正在docker中建立映像 复制命令由于找不到正确的目录而失败。

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 :(得分:0)

来不及回复,但是第二个COPY命令COPY . /usr/src/app替换了RUN pip3 install -r requirements.txt生成的/ usr / src / app内容。

尝试

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

答案 1 :(得分:0)

我在用铍构建图像时遇到了类似的问题,并且解决了将此问题删除到.dockerignore

的问题。
$ sudo docker build -t apache .
Sending build context to Docker daemon  

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

答案 2 :(得分:0)

larsks suggests in his comment一样,您需要在services/users目录中的文件。要了解原因,了解“上下文”很有用。

Docker不在客户端上构建,它看不到当前目录或文件系统上的其他文件。而是将build命令的最后一个参数作为构建上下文传递。使用docker-compose,此上下文默认为当前目录,您通常会在.命令中将其视为docker build,但可以像在./services/users中所做的那样覆盖它作为您的上下文。运行构建时,第一步是将构建上下文从Docker客户端发送到服务器。即使客户端和服务器位于同一主机上(常见的默认设置,尤其是对于桌面环境),也会发生相同的过程。 .dockerignore中列出的文件以及构建上下文的父目录中的文件不会发送到Docker服务器。

运行COPYADD命令时,第一个参数(或具有多个参数时,除最后一个参数外的所有参数)都引用构建上下文中的文件,而最后一个参数是目标文件图片中的文件或目录。


因此,当您组合以下撰写文件条目时:

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中。