使用不同的目录上下文构建docker镜像

时间:2018-03-07 21:51:43

标签: docker docker-compose

我目前的项目包括一个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指令的图像。

这有可能吗?

1 个答案:

答案 0 :(得分:5)

使用标记-f设置自定义路径

示例:docker build --rm -t my-app -f path/to/dockerfile .