Docker没有缓存Alpine apk add命令

时间:2019-12-13 18:04:13

标签: docker docker-compose dockerfile alpine

每次构建容器时,我都必须等待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是什么?我怎么能得到它?

3 个答案:

答案 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)

您可以下载maclinuxwindows的Docker x86_64二进制文件,并解压缩/使它可执行。

无论何时在Docker容器中安装任何软件包,这些软件包都应放在Dockerfile的开头,因此它不会再询问您安装相同的软件包,并且COPY命令部分必须位于Dockerfile的结尾。 / p>