当我使用 运行构建时docker-compose build --progress plain,它在构建过程中显示比默认 BuildKit 输出更有用的信息。
有没有办法将简单的进度选项嵌入到 docker-compose.yml 文件本身中,这样我就可以调用docker-compose build并仍然获得更好的输出?
我尝试添加这些构建参数,但它们似乎都不起作用:
build:
args:
#progress: plain
#- progress=plain
#- progress plain
#BUILDKIT_PROGRESS: plain
#- BUILDKIT_PROGRESS=plain
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试使用 BuildKit/BuildX 构建多平台映像(x86_64、arm64、armv7、armv6),并且似乎构建成功,但我似乎找不到映像所在的位置。与我之前的 x86_64 版本相比,它并没有显示出任何变化,并且当尝试将其推送到我的存储库时,它说所有层都已经存在,并且只存在一个平台。我用来构建图像的命令是:
docker buildx build \
--platform linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 -m 5120M \
--no-cache \
--progress auto \
--pull -t frostedflakez/php-mysql-webserver:php-latest-7.4 \
--push ./
Run Code Online (Sandbox Code Playgroud)
构建后我从终端得到的最后几行是:
=> exporting to image 264.6s
=> => exporting layers 46.1s
=> => exporting manifest sha256:585ca6c82887a6f0178007c905f11c7fbde5e6220b9c451892c40d2844b43403 0.0s
=> => exporting config sha256:0923c92918eb6fad44396000250f11946f38f6e1eb0d78ec916a794f395f526a 0.0s
=> => exporting manifest sha256:0b9fceb5f74bca71942ce3e1aa5fdf5ed0453e16aff53bec5d22a9c15233fbc2 0.0s
=> => exporting config sha256:ba19e5dab51b74549775cfbc1b0ce3961342a2c859050d98e68b6130ee276e91 0.0s
=> => exporting manifest sha256:540ef45e6b3cfec74af6a4c641b70009587b19b1fe5702338a9b93b409136b28 0.0s
=> => exporting config sha256:7be378e1831fa4bd00f1595bf4d511286c600d21ee245db567115fb85fdd24cc 0.0s
=> => exporting manifest sha256:9a339a6283db4ffe56c735d85306e87261aebe8a7f696984da67720f24d4ab73 0.0s …Run Code Online (Sandbox Code Playgroud) 据我所知docker buildx build --push将用您在--platform参数中指定的图像架构覆盖现有的图像架构。据我了解,在使用buildx. 但是,我知道官方 docker 镜像使用arm64构建农场来构建linux/arm64镜像。这怎么可能?他们只是使用docker pushwithout吗buildx?如果是这样,是否意味着docker push不会覆盖现有架构buildx?如果我想在不同的机器上构建和推送多个架构,最好的方法是什么?
我正在使用新的实验性 docker buildkit 语法来进行多阶段构建,如下所示:
Dockerfile:
RUN --mount=type=cache,target=/home/build/.build-cache,gid=1000,uid=1001 ./build
Run Code Online (Sandbox Code Playgroud)
重击:
RUN --mount=type=cache,target=/home/build/.build-cache,gid=1000,uid=1001 ./build
Run Code Online (Sandbox Code Playgroud)
在本地效果很好。在 CI 上我每次都会得到一个新的 docker 环境,所以没有缓存。
我可以将文件导出和导入到环境中,但我不知道缓存位于哪里。有任何想法吗?
或者我应该通过一些 docker 命令导出/导入缓存?我已阅读https://docs.docker.com/engine/reference/commandline/build/#specifying-external-cache-sources和https://github.com/moby/buildkit#export-cache但不清楚对我来说,这是特定于 buildkit 的,是特定于 docker 的,或者是否真正适用于安装到 Dockerfile RUN 命令中的此缓存。
我在这里添加了一个失败测试的公共要点,展示了我所希望的: https ://gist.github.com/Mahoney/85e8549892e0ae5bb86ce85339db1a71/6308f1bdb062a8982017193b96d61ec00a7698c5
后来的修订版有效,但我对此不满意 - 太多的引导: https://gist.github.com/Mahoney/85e8549892e0ae5bb86ce85339db1a71
据我了解:
我能收集到的差异:
我不清楚的是两组工具之间的重叠程度以及何时应该使用其中一个而不是另一个。例如,这两个工具似乎都很好地涵盖了在 Kubernetes 集群上自托管远程映像构建场的用例。
yarn install我正在尝试在使用 Docker BuildKit 构建 Docker 映像时生成并重用缓存。纱线缓存保留在目录中.yarn/cache,并且永远不应包含在最终映像中(.yarn/cache相对于构建上下文根)。该.yarn/cache目录应该在多个构建之间共享,以便始终从热缓存启动并具有快速yarn install命令(即使我们由于 的更改而导致缓存未命中package.json)。如果我们可以在结束后访问.yarn/cache内容docker build,则可以轻松在多个构建之间共享,例如将其上传到 Amazon S3 或 GCS 存储桶。
我考虑过两种选择:
RUN --mount=type=bindRUN --mount=type=cache下面描述为什么这两种方法都不起作用。
(简化的)Dockerfile 如下所示:
ENV YARN_CACHE_FOLDER ".yarn/cache"
COPY package.json yarn.lock ./
RUN --mount=type=bind,source=.yarn/cache,target=.yarn/cache,rw yarn install --frozen-lockfile
Run Code Online (Sandbox Code Playgroud)
.yarn/cache不幸的是,命令结束后目录中不存在任何数据docker build。
rw选项文档中描述了没有保留数据的原因:Allow writes on the mount. Written data will be discarded。如果写入的数据被丢弃,那么第一次生成缓存的工作方式是什么?
RUN --mount=type=cache或者我考虑使用RUN --mount=type=cache. …
docker dockerfile yarnpkg google-cloud-build docker-buildkit
我必须在使用 CMD 运行容器时执行 git Push。但是 ssh 在最后一行(即 CMD 部分)中不可用,无法进行 git 推送。我可以在这里做什么来获取 git Push 的 ssh 密钥?请有人帮助我。
请找到我的Dockerfile
# syntax = docker/dockerfile:1.0-experimental
FROM continuumio/anaconda3
# Install git
RUN apt-get update && apt-get install -y git
# Download public key for github.com
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
# Clone private repository
RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject
CMD python myproject/src/example.py && git push
Run Code Online (Sandbox Code Playgroud)
然后我使用以下命令在运行期间传递我的 ssh 密钥
docker build --ssh default .
Run Code Online (Sandbox Code Playgroud) 我开始使用 docker buildx 来标记多平台映像并将其推送到 ECR。但是,ECR 似乎将标签应用于父清单,并将每个相关清单保留为未加标签。ECR 似乎确实可以防止删除子清单,但它使管理孤立的未标记图像的清理变得复杂。
有没有办法以某种方式标记这些子清单?
例如,考虑一下这个推送:
docker buildx build --platform "linux/amd64,linux/arm64" --tag 1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0 --push .
Run Code Online (Sandbox Code Playgroud)
检查图像:
docker buildx imagetools inspect 1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0
Run Code Online (Sandbox Code Playgroud)
显示:
Name: 1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest: sha256:4221ad469d6a18abda617a0041fd7c87234ebb1a9f4ee952232a1287de73e12e
Manifests:
Name: 1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0@sha256:c1b0c04c84b025357052eb513427c8b22606445cbd2840d904613b56fa8283f3
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/amd64
Name: 1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0@sha256:828414cad2266836d9025e9a6af58d6bf3e6212e2095993070977909ee8aee4b
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/arm64
Run Code Online (Sandbox Code Playgroud)
然而,ECR 将 2 个子图像显示为untagged
我最近听说了 Buildkit,并一直在尝试将它与 Docker 一起使用。
我正在
DOCKER_BUILDKIT=1 docker build . -t experimental
用来构建我的 Dockerfile。
Dockerfile由于缺少一些依赖包,我的构建不正确。
我想要做的是附加到最后一个工作的中间容器并使用apt工具解决问题。
在不使用 Buildkit 的情况下构建时,这可以通过终端输出的中间容器的哈希值实现。
但是,Buildkit 的输出并没有为我提供这样的值。那么,有什么方法可以让我访问它们吗?
提前致谢。
docker ×10
docker-buildkit ×10
dockerfile ×5
buildx ×2
amazon-ecr ×1
containers ×1
docker-build ×1
docker-cli ×1
git ×1
kaniko ×1
ssh ×1
yarnpkg ×1