关于java:访问Dockerfile中的上下文

Access to outside of context in Dockerfile

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

1
2
3
4
5
6
7
8
9
docker/
   docker-compose.yml
   A/
     Dockerfile
   B/
     Dockerfile
src/
target/
   foo.war

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

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

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

failed to build: COPY failed: Forbidden path outside the build
context: ../../target/foo.war

docker-compose.yml公司

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3.6'
services:
  fooA:
    build: ./docker/A
    ports:
      -"8080:8080"
    depends_on:
      - fooB

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

你能告诉我怎么解决这个问题吗?我不想在每次项目构建后手动复制war文件。


你可以把你的项目结构成在目录树中有你的合成文件和dockerfile。您需要更改撰写文件以支持此功能,如下所示:

1
2
3
build:
                        context: ../
                        dockerfile: docker/A/Dockerfile

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


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

通过将dockerfile指令与context指令混合使用,您可能会有一些运气。

1
2
3
build:
  context: .
  dockerfile: A/Dockerfile

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


DIR结构

假设您有以下dir结构

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

文档文件

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

1
COPY start.sh /runtime/start.sh

码头工人组成

  • 真正的诀窍就在这里。要设置的上下文是主内容所在的目录。
  • 在本例中,您的sharedcontext dir是runtimedir。
    • 假设这个目录下的所有文件都被复制到一个名为context的目录中。
    • 现在,成像您可以只指定要复制到同一目录的dockerfile。您可以使用dockerfile指定。

docker-compose.yml如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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目录之外的文件一起工作。当您进行适当的映射时,结果是相同的!

码头工作愉快吗??!