Docker不缓存Alpine apk add命令

问题描述 投票:0回答:3

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

docker docker-compose dockerfile alpine
3个回答
0
投票

[每当有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应用程序需要编译应用程序的附加步骤,通常会使其适用于多阶段构建,但是在两个阶段都可以重复相同的模式。)


0
投票

重新排列您的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安装而失效。


0
投票

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

[无论何时在Docker容器中安装任何软件包,这些软件包都应在Dockerfile的开头,因此它不会再次询问您安装相同的软件包,并且源代码复制命令部分必须在Dockerfile的末尾。

© www.soinside.com 2019 - 2024. All rights reserved.