我目前的项目包括一个mongo服务器,一个rabbitmq服务器和一个dotnet核心服务。其结构如下:
.
├── project1.docker-compose.yml #multiple docker-compose files for all projects
├── .dockerignore
├── Util/
| └── some common code across all projects
└── Project1/ #there are multiple projects at the same level with the same structure
├── .docker/
| ├── mongodb
| | └──Dockerfile
| └── rabbitmq
| └──Dockerfile
├── BusinessLogicClasses/
| └── some classes that contain my business logic
└── DotNetCoreService/
├── my service code
└── .docker
└──Dockerfile
现在我可以使用docker-compose命令成功构建mongodb,rabbitmq和dot net core的映像。 docker-compose.yml位于主目录级别,因为我的不同项目(在本例中为Project1)引用了在Util目录下找到的代码。因此,我需要能够提供一个位于两个目录之上的上下文,以便我可以在Dockerfile上使用COPY操作。
我的基本project1.docker-compose.yml如下(我排除了不重要的部分)
version: '3'
services:
rabbitmq:
build:
context: Project1/.docker/rabbitmq/
mongodb:
build:
context: Project1/.docker/mongodb/
dotnetcoreservice:
build:
context: ./
dockerfile: Project1/DotNetCoreService/.docker/Dockerfile
可以看出,dotnetcoreservice的上下文位于主目录级别。因此,我对该特定图像的Dockerfile需要从上下文中定位完整路径,如下所示:
#escape=`
FROM microsoft/dotnet:2.0-sdk AS build
WORKDIR /app
COPY Project1/ ./Project1/
COPY Util/ ./Util/
RUN dotnet build Project1/DotNetCoreService/
当通过主目录级别的docker-compose命令调用时,此dockerfile可以成功运行,但是当通过docker build .\Project1\DotNetCoreService\.docker\
命令调用时,它会失败并显示以下消息:
COPY失败:stat / var / lib / docker / tmp / docker-builder241915396 / Project1:没有 这样的文件或目录
我认为这是实际上下文的问题,因为docker build
指令自动将上下文设置为Dockerfile的位置。我希望能够使用相同的目录结构来创建包含docker-compose build
以及docker build
指令的图像。
这有可能吗?
答案 0 :(得分:5)
使用标记-f
设置自定义路径
示例:docker build --rm -t my-app -f path/to/dockerfile .