[每次构建容器时,我都必须等待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
是什么?我如何得到它?
[每当有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应用程序需要编译应用程序的附加步骤,通常会使其适用于多阶段构建,但是在两个阶段都可以重复相同的模式。)
重新排列您的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安装而失效。