【问题标题】:docker-compose gives ERROR: Cannot locate specified Dockerfile: Dockerfiledocker-compose 给出错误:找不到指定的 Dockerfile:Dockerfile
【发布时间】:2016-03-26 14:31:17
【问题描述】:

我已经克隆了一个使用 docker-compose 的 docker 设置。一位远程开发人员确认它可以工作,所以我的问题似乎与我的设置有关。

我跑了docker-compose up,但目前这给了我这个:

$ docker-compose up
Creating volume "mycompanydocker_mysql-data" with local driver
Creating volume "mycompanydocker_redis-data" with local driver
Creating volume "mycompanydocker_app-data" with local driver
Creating volume "mycompanydocker_mongo-data" with local driver
mycompanydocker_redis_1 is up-to-date
mycompanydocker_mongo_1 is up-to-date
mycompanydocker_mysql_1 is up-to-date
Building app
ERROR: Cannot locate specified Dockerfile: Dockerfile

我的docker-compose.yml 看起来像这样:

version: '2'

services:
  mysql:
    build: mysql/.
    env_file: env
    expose:
    - 3306
    ports:
    - "3306:3306"
    volumes:
    - mysql-data:/var/lib/mysql

  mongo:
    build: mongo/.
    env_file: env
    expose:
    - 27017
    ports:
    - "27017:27017"
    volumes:
    - mongo-data:/data/db

  redis:
    build: redis/.
    env_file: env
    expose:
    - 6379
    ports:
    - "6379:6379"
    volumes:
    - redis-data:/data

  app:
    build: app/.
    env_file: env
    expose:
     - 80
    ports:
    - "80:80"
    volumes:
    # To mount a local directory, change this
    # To use a docker volume
    - app-data:/app
    # local app
    # - ./mycompany:/app
    depends_on:
    - mysql
    - mongo
    - redis

volumes:
  app-data:
    driver: local
  mysql-data:
    driver: local
  redis-data:
    driver: local
  mongo-data:
    driver: local

树看起来像这样:

$ tree
.
├── README.rst
├── app
│   ├── Dockerfile
│   ├── bin
│   │   ├── setup.sh
│   │   ├── start-nginx.sh
│   │   ├── start-rqworker.sh
│   │   ├── start.sh
│   │   └── update.sh
│   ├── etc
│   │   ├── nginx
│   │   │   └── sites-available
│   │   │       └── app
│   │   ├── supervisor
│   │   │   └── conf.d
│   │   │       └── supervisord.conf
│   │   └── supervisord.conf
│   └── ssh
│       └── id_rsa
├── docker-compose.yml
├── env
├── mongo
│   └── Dockerfile
├── mysql
│   └── Dockerfile
└── redis
    └── Dockerfile

我不明白的是docker-compose 似乎找到了所有Dockerfiles,除了app 文件夹中的那个。我在 OSX 10.11.2 上安装了以下内容:

  • Docker version 1.10.3, build 20f81dd
  • docker-compose version 1.6.2, build 4d72027

我刚开始使用 Docker,我有点卡在这里。有谁知道可能出了什么问题或我如何调试它?欢迎所有提示!

[编辑]
我忘了说没有隐藏的.dockerignore文件:

$ ls -la
total 56
drwx------@   11 kramer  staff    374 25 mrt 14:13 .
drwx------+ 1134 kramer  staff  38556 26 mrt 17:27 ..
-rw-r--r--@    1 kramer  staff   8196 26 mrt 08:14 .DS_Store
-rw-r--r--@    1 kramer  staff     23 24 mrt 15:29 .gitignore
-rw-r--r--@    1 kramer  staff   3879 24 mrt 15:29 README.rst
drwxr-xr-x@    7 kramer  staff    238 25 mrt 14:26 app
-rw-r--r--@    1 kramer  staff    868 25 mrt 17:50 docker-compose.yml
-rw-r--r--@    1 kramer  staff    219 24 mrt 15:29 env
drwxr-xr-x@    3 kramer  staff    102 24 mrt 15:29 mongo
drwxr-xr-x@    3 kramer  staff    102 24 mrt 15:29 mysql
drwxr-xr-x@    3 kramer  staff    102 24 mrt 15:29 redis

并且.gitignore 文件也没有包含任何特殊内容(不知道是否重要):

$ cat .gitignore
.project
.pydevproject

【问题讨论】:

  • 检查您是否有隐藏的.dockerignore 文件,其内容中可能包含Dockerfile。另一个可能的原因是您的文件夹结构中有符号链接。
  • @warmoverflow - 我忘了提到没有.dockerignore。我搜索了整个文件系统 (sudo find / -name .dockerignore) 并确实找到了一个 .dockerignore 文件,但那是在一些完全不相关的 repo 中。此外,项目中没有符号链接。
  • 能否明确指定 Dockerfile 名称,看看是否有效。见docs.docker.com/compose/compose-file/#contextbuild: context: . dockerfile: Dockerfile-alternate
  • @warmoverflow - 我尝试明确指定 docker 文件,但我得到了 Unsupported config option for services.app: 'dockerfile'。根据this issue,不支持指定 dockerfile。还有其他想法吗?
  • 对我来说,问题是我的 Dockerfile 是在一个目录中指定的。 dockerfile 与为构建提供的 context 相关。

标签: docker docker-compose


【解决方案1】:

这里是如何指定 dockerfile。抱歉,我不能在 cmets 中这样做,因为那里不支持格式化。

https://docs.docker.com/compose/compose-file/#context

app:
    build:
      context: app
      dockerfile: Dockerfile

【讨论】:

  • 感谢您的建议,但我刚刚发现了问题。原来 Dockerfile 的名称是 Dockerfile ,最后有一个空格。我不知道那个空间是如何到达那里的,但是是的,它又开始工作了.. :-) 不过感谢您的一百万个建议!我会接受你的回答,因为它也会引导我找到解决方案。
  • 很高兴你发现了。这很难注意到。
  • 对于那些不清楚为什么会这样的人,原因是因为在定义的构建上下文中搜索了dockerfile
  • 谢谢,这是在 Visual Studio 2017 上运行 docker 的最简单方法,节省了我很多时间!!我试图尝试解决这个问题超过 2 天。不知道为什么模板不将此答案列为默认模板
【解决方案2】:

我在 Windows 上遇到了这个问题,docker-compose.yml 由 Visual Studio 模板创建。模板创建为:

build:
  context: .
  dockerfile: <ProjectFolder>\Dockerfile

我得到了错误:Cannot locate specified Dockerfile: &lt;ProjectFolder&gt;\Dockerfile。我将\ 更改为/,它开始为我工作(即&lt;ProjectFolder&gt;/Dockerfile)。如果有人在 Windows 上遇到此错误,也许这会有所帮助。

【讨论】:

  • 伙计!我可以给你一个湿漉漉的大吻!
  • 另外,fwiw,它正在寻找与指定上下文相关的 Dockerfile。所以我的context: ./services/export/ 需要dockerfile: config/Dockerfile,其中config 是export 中的一个文件夹。
  • @Evan Morrison 感谢您的示例,我的 docker 文件位于名为 Docker 的文件夹中,因此我不得不在 ymal 文件中写入路径,例如:dockerfile: ./docker/docker-apache.dockerfile
【解决方案3】:

docker-compose.yml里面的文件做改动,以满足Dockerfile:

app:
  build: ./app

【讨论】:

    【解决方案4】:

    您需要正确指定 docker 文件名,并且区分大小写。我在 DockerFile 中有大写字母,因此找不到它们。希望它可以帮助像我一样挣扎的人。最好在 docker compose 文件中使用 dockerfile 属性。

    app:
        build:
          dockerfile: DockerFile
    

    【讨论】:

      【解决方案5】:

      尝试了几种变体,出于某种未知原因,我不得不使用绝对路径才能工作

      ├── visit-count
      |   ├── docker-compose.yml
      │   ├── Dockerfile
      │   ├── files
      │   │   ├── index.js
      │   │   ├── package.json
      
      version: '3.5'
      services:
        visit-count:
          build: 
            context: /Users/deltapeng/source/repos/visit-count/files/
            dockerfile: /Users/deltapeng/source/repos/visit-count/Dockerfile
      

      但是在我上面的工作之后,发现这个相对路径也有效。

      version: '3.5'
      services:
        visit-count:
          build: 
            context: ./files/
            dockerfile: ../
      

      【讨论】:

        【解决方案6】:

        path 是您期望 Dockerfile 的位置吗?您可以使用--verbose 标志进行检查,例如:

        docker-compose --verbose up | grep compose.cli.verbose_proxy.proxy_callable | grep path
        

        例如:

        compose.cli.verbose_proxy.proxy_callable: docker build <- 
        (pull=False, cache_from=None, stream=True, nocache=False, labels=None,
        tag='your_app',
        buildargs={'some_build': '1901', 'addr': '0.0.0.0', 'corsdomain': '*',
        'rpcport': '8545'}, forcerm=False, rm=True,
        
        path='/Users/jmunsch/Desktop/dev/your_app/app?', # in the verbose output
        
        dockerfile='Dockerfile')
        

        在 Dockerfile 中定义 ARGS:

        ARG some_flag=
        ARG some_build=1900
        ARG addr=0.0.0.0
        ARG corsdomain="*"
        ARG rpcport=8545
        

        在一个像这样的撰写文件中:

        build:
            context: ./your_app
            dockerfile: Dockerfile
            args:
              some_flag:       # --some_flag
              some_build: 1901 # --some_build 1901
              rpcaddr: 0.0.0.0 # --rpcaddr 0.0.0.0
              rpcport: 8545    # --rpcport 8545
              corsdomain: "*"  # --corsdomain
        

        【讨论】:

          【解决方案7】:

          在我的情况下,它是 git 上的错误分支。如果您从远程上下文构建图像,请不要忘记设置特定分支。上下文的 URL 应如下所示:

          services:                                                                                                                                                                                                 
          wss-home:                                                                                                                                                                                               
            build:                                                                                                                                                                                                
            context: "http://${LOGIN}:${PASSWD}@host/path/to/repository.git#branch_name"                                                                                                        
            dockerfile: Dockerfile.prod
          

          【讨论】:

          • 这也是我的错?
          • 我忘了克隆子模块 :)
          • @nathanfranke 感谢您的评论。老实说,值得单独回答。
          • 我的解决方案并不是真正的答案,因为它超出了这个问题的范围。唯一的答案是我猜“确保它存在”
          【解决方案8】:

          Visual Studio 自动创建的 docker-compose 文件有这个问题,并尝试了@crgolden 解决方案,但没有成功。

          我只让它在之后运行:

          1) Renaming the file VS created from DockerFile to Dockerfile (notice the lower case 'f')
          2) change the config to this:
          services:
              ...
              <image-name>:
                   build:
                       context: <project_name>
                       dockerfile: Dockerfile
          

          【讨论】:

            【解决方案9】:

            错误的路径, 当 dockerfile 和 compose 在同一位置时,我在 linux ubuntu 上的最短路径

            build: ./
            

            【讨论】:

            • 好收获!我也有同样的情况
            • 我遵循了关于使用 python/Flask 的 Docker 教程,然后重新构建了我的文件以遵循似乎在其他地方用于 Flask 的结构,并且没有改变这个或我的 Dockerfile 的位置。
            【解决方案10】:
              build: 
                      context: ./
                      dockerfile: DockerFile
            

            这可能有助于版本:'3.8' 为当前目录设置 否则,必须指定 dockerfile 绝对路径,如

            build: 
                      context: .
                      dockerfile: <project_directory>\DockerFile
            

            【讨论】:

            • 就我而言,param dockerfile 的相对路径必须使用 /,而不是 `\`,这让我一天都被屏蔽了。
            【解决方案11】:

            我遇到了这个错误,因为我的 docker-compose 在子目录中。我没有意识到的是,在 docker-compose 文件中:

            • 您指定的构建上下文与 docker-compose 文件所在的位置相关(在正确的第一个屏幕截图中,构建上下文从 docker compose 文件位置向上移动了两个目录,位于存储库的基础)李>
            • 您指定的 dockerfile 位置相对于设置构建上下文的位置(在正确的第一个屏幕截图中,我需要进入两个目录,进入 service/deploy,以找到 Dockerfile,因为我只是将上下文设置为两个目录)

            我之前所做的导致错误:“无法找到指定的 Dockerfile”:

            我希望这可以帮助别人!

            【讨论】:

              【解决方案12】:

              我在 ubuntu vm 上遇到过同样的问题。 我做了以下步骤:

              sudo apt-get remove docker-compose
              sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
              sudo chmod +x /usr/local/bin/docker-compose
              sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
              

              我希望这能解决这个问题。

              【讨论】:

                【解决方案13】:

                构建:
                上下文:./
                dockerfile: DockerFile

                只需添加

                构建:
                上下文:./
                dockerfile: DockerFile.dockerfile

                【讨论】:

                  猜你喜欢
                  • 2017-06-22
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-12-25
                  • 2021-05-24
                  相关资源
                  最近更新 更多