使用docker-compose build时Docker不创建新容器

时间:2019-05-16 09:17:10

标签: windows powershell docker

我已经为ASP.NET和MSSQL服务器设置了两个Windows容器。在第一个docker-compose构建中,一切正常。然后,在对自定义dockerfile进行一些更改并再次运行docker-compose build之后,它将再次使用旧容器,而不进行任何更改。

我认为在进行构建时会创建一个新的容器。我是否误解了docker的工作原理?

这是docker-compose.yml

version: '3'
services:
  db:
    image: microsoft/mssql-server-windows-developer

    environment:
      sa_password: "Password1234!"
      ACCEPT_EULA: "Y"

    ports:
      - "8003:1433"
    build:
      context: .
      dockerfile: mssql.dockerfile

  web:
    build:
      context: .
      dockerfile: web.dockerfile
    image: mcr.microsoft.com/dotnet/framework/aspnet:4.8
    #volumes:
    #  - .:C:/inetpub/wwwroot
    ports: 
      - "8080:80"
      - "8081:431"

这是mssql.dockerfile

# escape=`

FROM microsoft/mssql-server-windows-developer

#set shell
SHELL ["powershell.exe", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

#make temp folder
RUN mkdir C:\temp

#copy script to temp folder
COPY DownloadDatabase.ps1 C:\temp
COPY RestoreDatabase.ps1 C:\temp

#run script to retrieve production database
WORKDIR C:\temp

RUN .\DownloadDatabase.ps1 -sourcefile <url> -destinationfile <target>

CMD .\RestoreDatabase.ps1

由于mkdir C:\ temp错误指出该目录已存在,因此很容易判断该映像是否已被重新使用。

编辑:我已经尝试过docker compose上的所有选项。无缓存,强制rm

2 个答案:

答案 0 :(得分:1)

docker-compose build 

仅生成图像,但不启动容器。

这就是为什么不应用您在dockerfile中所做的更改的原因。您已经重建了映像,但是没有重建容器。这就是为什么容器previoulsy启动基于该映像的旧版本的原因。

docker-compose up 

来自Docker documentation

  

如果已有用于服务的容器,并且在容器创建后更改了服务的配置或映像,则docker-compose up会通过停止并重新创建容器(保留装入的卷)来获取更改。为了防止Compose获取更改,请使用--no-recreate标志。

为了确保可以同时重建图像和容器,您必须添加以下标志:

docker-compose up --force-recreate --build

这样,您的容器将基于正确的图像版本。

来自Docker documentation的标志说明:

--build                   Build images before starting containers.

--force-recreate          Recreate containers even if their configuration
                          and image haven't changed.

如果要对特定服务执行此操作,只需在命令行末尾添加服务名称:

docker-compose up --force-recreate --build serviceName

如果要获得清晰的输出,另一个有用的标志是-d标志:

 -d, --detach              Detached mode: Run containers in the background,
                           print new container names. Incompatible with

答案 1 :(得分:0)

事实证明,我只需要在docker-compose pull之前执行docker-compose build来刷新dockerfile!现在,它每次都会构建一个新图像!