如何在使用Docker Compose时有效地重建项目?

cod*_*ded 9 build go build-time docker docker-compose

这可能是一个愚蠢的问题,但我是使用Docker-compose的新手.到目前为止,我喜欢它...但我有一些很长的构建时间.我有一个包含多个依赖项的项目,每次进行更改时我都需要显然重建源代码.现在,我正在呼吁docker-compose build重建容器,然后是一个docker-compose up.问题是:

  1. 它正在为源代码所做的每一次更改重建整个容器(这需要很长时间 - 获取依赖项/等).这显着减慢了我的速度.

  2. 我真的觉得我应该能够在容器上运行命令来重建然后重新运行可执行文件,就像这样:

    docker-compose run web go build .
    docker-compose run web ./app
    要么
    docker-compose run web go build .
    docker-compose restart
    
    这应该有效,因为我正在使用卷在主机和容器之间共享代码.不应该需要重新获取所有依赖项.它不应该使用新建的可执行文件吗?但是,这并不反映构建的更改和端口转发似乎中断.

作为参考,这是我的Dockerfile:

FROM golang:1.8

COPY . /go/src/github.com/codeblooded/test1
WORKDIR /go/src/github.com/codeblooded/test1

RUN echo $PATH
RUN go get -d -v ./...
RUN go install -v ./...

RUN go build -o test1 .
CMD ["test1"]
EXPOSE 3470
Run Code Online (Sandbox Code Playgroud)

还有我的docker-compose.yml文件:

version: '3'
services:
  postgres:
    image: postgres
    volumes:
      - ./db/data/psql:/var/lib/postgresql/data
      - ./db/schema:/db/schema
  redis:
    image: redis
    volumes:
      - ./db/data/redis:/data
  server:
    build: .
    command: test1
    volumes:
      - .:/go/src/github.com/codeblooded/test1
    ports:
      - "3470:3470"
    depends_on:
      - postgres
      - redis
Run Code Online (Sandbox Code Playgroud)

有什么我想念的吗?

Rob*_*ert 10

你提出了一个很好的问题.

Dockerfile中命令的顺序非常重要.首先放置那些不会频繁更改的内容,以及后来最有可能在每个内部版本中更改的内容:

FROM golang:1.8

RUN go get -d -v ./...
RUN go install -v ./...

COPY . /go/src/github.com/codeblooded/test1
WORKDIR /go/src/github.com/codeblooded/test1

RUN echo $PATH

RUN go build -o test1 .
CMD ["test1"]
EXPOSE 3470
Run Code Online (Sandbox Code Playgroud)

当关于先前构建的图层更改时,docker会丢弃以下缓存图层,然后再次运行它们,有时会浪费您的时间.

注意在前一个版本中重用的每个图层中的docker输出的"Using cache"句子.

对于您的开发工作,另一个建议是每次更改代码时都使用fresh来自动重新构建go应用程序.只需将其安装在容器中,只需command: fresh在docker-compose.yml中使用即可

  • 我看到这个关于新鲜的评论。您能详细说明一下如何设置新鲜吗? (2认同)