Docker 未缓存 Alpine apk 添加命令

Docker isn't caching Alpine apk add command

每次构建容器时,我都必须等待 apk add docker 完成,这需要很长时间。 因为每次它下载相同的东西,我可以以某种方式强制 Docker 缓存 apk 的下载用于开发目的吗?

这是我的Docker文件:

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"]

顺便说一句,我在 docker-compose.yml 中使用这部分 volumes: - /var/run/docker.sock:/var/run/docker.sock 来使用兄弟容器,如果这很重要的话。

编辑:我发现 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 ... 命令移动到文件的开头,然后再 COPYs 任何内容,它将被缓存 运行s。

大多数 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 安装而失效。

您可以下载 Docker x86_64 mac, linux, windows 和 unzip/untar 的二进制文件并使其可执行。

无论何时在 Docker 容器中安装任何包,这些包都应该位于 Docker 文件的开头,因此它不会再次要求您安装相同的包和 COPY命令部分必须在 Docker 文件的末尾。