每次构建容器时,我都必须等待apk add docker
完成,这需要很长时间。
既然每次下载都相同,那么我可以以某种方式强迫Docker缓存apk的下载以进行开发吗?
这是我的Dockerfile:
FROM golang:1.13.5-alpine
WORKDIR /go/src/app
COPY src .
RUN go get -d -v ./...
RUN go install -v ./...
RUN apk add --update docker
CMD ["app"]
顺便说一句,如果重要的话,我正在volumes: - /var/run/docker.sock:/var/run/docker.sock
中使用这一部分docker-compose.yml
来使用同级容器。
编辑:我发现Google复制了docker.tgz
in Chromium:
# add docker client -- do not install docker via apk -- it will try to install
# docker engine which takes a lot of space as well (we don't need it, we need
# only the small client to communicate with the host's docker server)
ADD build/docker/docker.tgz /
docker.tgz
是什么?我怎么能得到它?
答案 0 :(得分:2)
重新排列您的Dockerfile,它应该可以工作。
FROM golang:1.13.5-alpine
RUN apk add --update docker
WORKDIR /go/src/app
COPY src .
RUN go get -d -v ./...
RUN go install -v ./...
CMD ["app"]
在安装之前要进行复制,因此,每当您在src
中进行更改时,缓存将对docker安装无效。
答案 1 :(得分:1)
每当您有COPY
命令时,如果任何文件涉及更改,它都会导致此后的每个命令重新运行。如果将RUN apk add ...
命令移至文件COPY
之前,将其移至文件的开头,则文件将在每次运行时被缓存。
用于大多数Dockerfile的一种通用配方可以适应这种模式,如下所示:
FROM some-base-image
# Install OS-level dependencies
RUN apk add or apt-get install ...
WORKDIR /app
# Install language-level dependencies
COPY requirements.txt requirements.lock ./
RUN something install -r requirements.txt
# Install the rest of the application
COPY main.app ./
COPY src src/
# Set up standard run-time metadata
EXPOSE 12345
CMD ["/app/main.app"]
(Go和Java应用程序需要额外的步骤来编译应用程序,这通常使其适用于多阶段构建,但是在两个阶段都可以重复相同的模式。)
答案 2 :(得分:1)