【问题标题】:COPY command fails复制命令失败
【发布时间】:2019-03-21 20:26:50
【问题描述】:

过去 3 天一直卡在这个问题上。我正在码头工人中建立一个形象和 由于找不到正确的目录,复制命令失败。

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 运行该命令,但没有帮助。有什么想法吗?

【问题讨论】:

  • 您的./services/users 目录中有requirements.txt 吗?
  • @larks Omg ...我将文件移动给用户并且它有效。我认为它应该在我正在执行脚本的目录中。不敢相信我被这个微不足道的错误困扰了这么久。
  • 所以需求文件需要和context属性指向的目录在同一个目录。
  • @BillyDarwin 好吧,这就是上下文的全部意义,如果您确实指定了上下文,那么是的,文件是相对于它的。如果您没有上下文,则上下文是相对于 Dockerfile 位置的。 docs.docker.com/compose/compose-file/#build
  • 如果你没有使用docker-compose,而是通过docker build构建镜像,那么上下文就是你可以给构建命令docker build . # context is the current dir vs docker build /path/to/my/context提供的唯一参数

标签: docker dockerfile


【解决方案1】:

回复有点晚,但是第二个 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

【讨论】:

  • 这只会是当前目录中 pip 安装文件的问题,并且 OP 在其构建上下文中具有相同的文件。复制命令不会删除文件,我相信 pip 会安装到用户或系统目录而不是当前工作目录。
【解决方案2】:

作为larsks suggests in his comment,你需要services/users目录下的文件。要了解原因,了解“上下文”很有用。

Docker 不在客户端上构建,它看不到您的当前目录或文件系统上的其他文件。相反,构建命令的最后一个参数作为构建上下文传递。使用 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 将尝试从./services/users 生成的构建上下文中复制requirements.txt 文件,这意味着./services/users/requirements.txt 需要存在,并且不会被./services/users 中的.dockerignore 文件排除。

【讨论】:

    【解决方案3】:

    我在用铍构建图像时遇到了类似的问题,我解决了这个问题,将其删除到 .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
    

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 2011-04-18
      • 2012-06-05
      相关资源
      最近更新 更多