这可能是一个愚蠢的问题,但我是使用Docker-compose的新手.到目前为止,我喜欢它…但我有一些很长的构建时间.我有一个包含多个依赖项的项目,每次进行更改时我都需要显然重建源代码.现在,我正在调用docker-compose构建来重建容器,然后是docker-compose.问题是:
>它正在为源代码的每次更改重建整个容器(这需要很长时间 – 获取依赖项/等).这显着减慢了我的速度.
>我真的觉得我应该能够在容器上运行命令来重建然后重新运行可执行文件,就像这样:
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
还有我的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
有什么我想念的吗?
最佳答案
你提出了一个很好的问题.
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
当关于先前构建的图层更改时,docker会丢弃以下缓存图层,然后再次运行它们,有时会浪费您的时间.
注意在前一个版本中重用的每个图层中的docker输出的“Using cache”句子.
对于您的开发工作,另一个建议是每次更改代码时使用fresh自动重新构建您的应用程序.只需将它安装在容器中,然后在docker-compose.yml中使用命令:fresh