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中,我需要使用以下命令访问
1 | COPY ../../target/foo.war /usr/local/tomcat/webapps/foo.war |
当我运行
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 |
然后您可以使用
据我所知,不可能访问构建上下文之外的内容。
通过将
1 2 3 | build: context: . dockerfile: A/Dockerfile |
您可能希望在项目根目录中包含一个
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是所有构建的驱动程序
文档文件
它的
1 | COPY start.sh /runtime/start.sh |
码头工人组成
- 真正的诀窍就在这里。要设置的上下文是主内容所在的目录。
- 在本例中,您的
shared context dir是runtime dir。- 假设这个目录下的所有文件都被复制到一个名为
context 的目录中。 - 现在,成像您可以只指定要复制到同一目录的dockerfile。您可以使用
dockerfile 指定。
- 假设这个目录下的所有文件都被复制到一个名为
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重用。 - 你得到了与父目录相同的效果,以一种更有组织的方式。
现在,您的构建与
码头工作愉快吗??!