多个Dockerfiles在docker-compose中构建镜像时失败。

12

我希望创建一个Docker Compose文件来减少运行测试所需的命令数量。我的目标是运行一个命令,它将启动我的容器并运行我的测试。这是我第一次创建Docker Compose文件,请耐心等待。Docker Compose文件位于其他两个Docker文件旁边。下面是我启动的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"

为了运行测试,我通常会执行以下操作: Shell 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 ./”即可。 - Zon
1个回答

30

类型错误:必须在路径中指定要构建的目录

当您将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参考手册-构建

编辑-第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... 附加到yetiui_headless-chrome_1、yetiui_dev-server_1 headless-chrome_1 | /bin/bash: -c: 选项需要一个参数 yetiui_headless-chrome_1退出代码为2 yetiui_dev-server_1退出代码为0 - user7209184
1
你需要为 /bin/bash 指定一个命令。如果你不想运行任何命令,那么可以将其全部留空,只需运行docker run -it --rm --net=host --cap-add=SYS_ADMIN headless-chrome - Ayushya
@Rafael,谢谢!测试现在可以运行了,存在一个小问题,就是它似乎不会等待开发服务器启动。我尝试添加 depends_on: dev-server,但感觉没有效果。看起来 dev-server 在我的 Selenium 启动之前就已经以代码0退出了。 - user7209184
很好,它运行得很好 :). 现在轮到你了。你需要让你的应用程序对这些故障具有弹性。我喜欢使用wait-for-it脚本,但还有其他选择。请查看Compose中的启动顺序控制获取更多信息。 - Rafael
1
好的!我会看一下的!我已经查看了控制启动顺序,但是那些尝试会循环等待直到开发服务器启动。我的问题略有不同,我的开发服务器已经启动然后立即退出,因此即使我的工作服务器尝试连接它,也会失败,因为开发服务器已经退出了。 - user7209184
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接