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 ...
命令移动到文件的开头,然后再 COPY
s 任何内容,它将被缓存 运行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 文件的末尾。
每次构建容器时,我都必须等待 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 ...
命令移动到文件的开头,然后再 COPY
s 任何内容,它将被缓存 运行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 文件的末尾。