【问题标题】:Multiple Dockerfiles failure at building images in docker-compose在 docker-compose 中构建图像时出现多个 Dockerfile 失败
【发布时间】:2017-07-20 22:10:38
【问题描述】:

我想创建一个 docker compose 以消除运行测试所需的命令数量。我的目标是运行一个命令,它将启动我的容器并运行我的测试。这是我第一次创建 docker compose 文件,所以请耐心等待。 docker-compose.file 位于其他两个 dockerfile 旁边。下面是我启动的 docker-compose,但我什至无法构建图像。我试图指定路径购买添加“volumes: -.:.”,但它仍然不起作用。

services:
      headless-chrome:
        build: ./Dockerfile-headless-chrome
      dev-server:
        build: ./Dockerfile

Traceback (most recent call last):
  File "/usr/local/bin/docker-compose", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/site-packages/compose/cli/main.py", line 68, in main
    command()
  File "/usr/local/lib/python2.7/site-packages/compose/cli/main.py", line 118, in perform_command
    handler(command, command_options)
  File "/usr/local/lib/python2.7/site-packages/compose/cli/main.py", line 926, in up
    scale_override=parse_scale_args(options['--scale']),
  File "/usr/local/lib/python2.7/site-packages/compose/project.py", line 401, in up
    svc.ensure_image_exists(do_build=do_build)
  File "/usr/local/lib/python2.7/site-packages/compose/service.py", line 311, in ensure_image_exists
    self.build()
  File "/usr/local/lib/python2.7/site-packages/compose/service.py", line 888, in build
    buildargs=build_args
  File "/usr/local/lib/python2.7/site-packages/docker/api/build.py", line 137, in build
    raise TypeError("You must specify a directory to build in path")
TypeError: You must specify a directory to build in path
version: "3"

为了运行我用来执行此操作的测试: 外壳 1:

$ SCHEME=http ENV=stage DOCKER_DEV_ENTRYPOINT='"npm run dev-server"' make docker-dev

运行时,我需要在新的 shell(shell 2)中运行以下代码:

$ docker build -t headless-chrome -f Dockerfile-headless-chrome .
$ docker run -it --rm --net=host --cap-add=SYS_ADMIN headless-chrome /bin/bash

然后当我在容器内运行时:

$ npm run selenium-docker
$ npm run uat

【问题讨论】:

  • 不要将 Dockerfile 的名称(例如 Dockerfile-headless-chrome)放到其路径中。就build ./

标签: docker docker-compose dockerfile


【解决方案1】:

TypeError: You must specify a directory to build in path

当您将build: ./Dockerfile-headless-chrome 添加到您的 docker-compose.yml 时,您正在设置上下文文件夹,而不是 Dockerfile 文件。你想要的属性是 build -> dockerfile:

  services:
    headless-chrome:
      build:
        context: .
        dockerfile: Dockerfile-alternate
    dev-server:
      build: .

对于dev-server,我没有设置任何内容,因为它将使用默认值(context: .dockerfile: Dockerfile)。实际上,headless-chrome 上的 context: . 也不需要,因为它是默认值。

Docker Compose reference - build

已编辑 - 第 2 部分

命令也有问题。要使其自动化,您必须更改您的/bin/bash

为所有测试创建一个文件 (entrypoint.sh):

npm run selenium-docker
npm run uat

将此文件添加到您的映像 (ADD) 并在启动容器时运行它 (CMD)。

# Dockerfile

... your commands

ADD entrypoint.sh
CMD bash entrypoint.sh

它已经准备好了。再次构建 docker-compose build(因为您编辑了 Dockerfile)并运行 docker-compose up

【讨论】:

  • 谢谢!我尝试了上述解决方案。但我收到另一个问题:警告:服务 headless-chrome 的图像已构建,因为它尚不存在。要重建此映像,您必须使用docker-compose builddocker-compose up --build。重新创建 Yetiui_dev-server_1 ... 重新创建 Yetiui_dev-server_1 创建 Yetiui_headless-chrome_1 ... 重新创建 Yetiui_dev-server_1 ... 完成/bin/bash: -c: 选项需要一个参数 Yetiui_headless-chrome_1 以代码 2 退出 Yetiui_dev-server_1 以代码 0 退出
  • 你需要为/bin/bash指定一个命令。如果您不想运行任何命令,则可以完全保留它并运行docker run -it --rm --net=host --cap-add=SYS_ADMIN headless-chrome
  • @Rafael,谢谢!测试现在运行,存在的一个小问题是它似乎没有等到开发服务器启动运行。我尝试添加depends_on:dev-server,但感觉没有效果。在我的硒启动之前,开发服务器似乎以代码 0 退出。
  • 很高兴它工作正常:)。现在由你决定。您需要使您的应用程序对这些故障具有弹性。我喜欢使用 wait-for-it 脚本,但还有其他选择。更多信息请查看Controlling startup order in Compose
  • 好的!我会看看它!我查看了控制启动顺序,但这些尝试尝试执行 while 循环,直到开发服务器启动。我的问题略有不同,我的开发服务器已启动,然后立即退出,因此即使我的工作服务器尝试连接它也会失败,因为开发已经退出。
猜你喜欢
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2018-04-23
  • 2021-10-29
  • 2019-08-13
相关资源
最近更新 更多