首页 > 解决方案 > 访问 Dockerfile 中的上下文之外

问题描述

在我的 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 uptt 给我错误

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

码头工人-compose.yml

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

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

你能告诉我如何解决这个问题吗?我不想在每个项目构建后手动复制战争文件。

标签: javamavendocker

解决方案


目录结构

假设您有以下目录结构

./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

码头工人组成

  • 真正的诀窍就在这里。您要设置的上下文是您的主要内容所在的目录。
  • 在此示例中,您的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. 当您进行正确的映射时,结果是一样的!

快乐 Dockering !


推荐阅读