访问Dockerfile中的上下文外部

时间:2018-06-20 12:43:48

标签: java maven docker

在我的Maven项目中,我具有以下结构:

docker/
   docker-compose.yml
   A/
     Dockerfile
   B/
     Dockerfile
src/
target/
   foo.war

在A的Dockerfile中,我需要使用以下命令访问/target文件夹中的war:

COPY ../../target/foo.war /usr/local/tomcat/webapps/foo.war

当我运行docker-compose up时tt给我错误

  

构建失败:COPY失败:构建之外的禁止路径   上下文:../../ target / foo.war

docker-compose.yml

version: '3.6'
services:
  fooA:
    build: ./docker/A
    ports:
      - "8080:8080"
    depends_on:
      - fooB

  fooB:
    build: ./docker/fooB
    ports:
      - "5433:5433"

您能告诉我如何解决吗?我不想在每次构建项目后手动复制war文件。

3 个答案:

答案 0 :(得分:2)

据我所知,无法在构建上下文之外访问其他内容。

在上下文中将dockerfile指令与context混合使用可能会有些运气。

build:
  context: .
  dockerfile: A/Dockerfile

您可能希望在项目根目录中包含.dockerignore,以防止将整个项目发送到docker守护程序,从而可能会降低构建速度。

答案 1 :(得分:2)

您可以对项目进行结构化,以在目录树中将Compose文件和Dockerfile与您的目录树一样。您需要更改Compose文件以支持此操作,例如:

build:
                        context: ../
                        dockerfile: docker/A/Dockerfile

然后您可以使用docker-compose -f docker/docker-compose.yml build建立此设置。

答案 2 :(得分:1)

目录结构

假设您具有以下目录结构

./docker-compose.yaml
./all-runners/
        /start.sh
        /runner-A/Dockerfile
        /runner-B/Dockerfile
        /runner-C/Dockerfile
  • 我要求所有Dockerfile共享同一文件
  • 顶级docker-compose是所有构建的驱动程序

Dockerfile

ALWAYS将从其相对路径加载,并将其自身的当前目录作为对您指定路径的local引用。

COPY start.sh /runtime/start.sh

Docker-compose

  • 真正的把戏在这里。您要设置的上下文是主要内容所在的目录。
  • 在此示例中,您的shared上下文目录是runtime目录。
    • 想象一下该目录下的所有文件都被复制到名为context的目录中。
    • 现在,您只需指定要复制到同一目录的Dockerfile即可。您可以使用dockerfile进行指定。

docker-compose.yml如下

version: "3.3"
services:

  runner-A
    build:
      context: ./all-runners
      dockerfile: ./runner-A/Dockerfile

  runner-B
    build:
      context: ./all-runners
      dockerfile: ./runner-B/Dockerfile

  runner-C
    build:
      context: ./all-runners
      dockerfile: ./runner-C/Dockerfile
  • 由于上下文设置为all-runners,因此start.sh中路径指定的每个单独的Dockerfile将重用文件dockerfile
  • 您可以通过更有条理的方式获得与父目录相同的效果

现在,您的内部版本可以处理Dockerfile目录外的文件。进行正确的映射后,结果是相同的!

快乐Dockering!