访问Dockerfile中的上下文外部

Den*_*nov 6 java maven docker

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

docker/
   docker-compose.yml
   A/
     Dockerfile
   B/
     Dockerfile
src/
target/
   foo.war
Run Code Online (Sandbox Code Playgroud)

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

COPY ../../target/foo.war /usr/local/tomcat/webapps/foo.war
Run Code Online (Sandbox Code Playgroud)

当我运行docker-compose uptt给我错误

生成失败: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"
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*les 8

目录结构

假设您有以下目录结构

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

文件

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

COPY start.sh /runtime/start.sh
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)
  • 由于上下文设置为all-runners,文件start.sh将被 中路径指定的每个单独的 Dockerfile 重用dockerfile
  • 您以更有条理的方式获得与父目录相同的效果

现在您的构建可以使用Dockerfile. 当您进行正确的映射时,结果是一样的!

快乐泊坞!


Dav*_*vid 4

据我所知,不可能访问构建上下文之外的东西。

dockerfile通过将该指令与context项目根目录中的 compose 文件中的指令混合,您可能会有一些运气,如下所示:

build:
  context: .
  dockerfile: A/Dockerfile
Run Code Online (Sandbox Code Playgroud)

您可能希望.dockerignore在项目根目录中包含 a ,以防止整个项目被发送到 docker 守护进程,从而导致构建速度可能慢得多。