docker - 如何使用 docker buildx Baker 替代 docker-compose up?

标签 docker docker-compose buildx

所以我有这个 docker 命令,可以在其他机器上正常工作,但由于我的是 M1 芯片,所以我遇到了问题。我想使用 buildxbake 来运行多个架构的 docker 容器。这是命令,

PY_VER=xxxx IMAGE=xxxx DISTRO=xxxxx \
PHARUS_VERSION=$(cat xxxxx/xxxx/xxxxx | tail -1 | awk -F\' '{print $2}') \
DJLABBOOK_VERSION=$(cat package.json | grep \"version\" | awk -F\" '{print $4}') \
HOST_UID=$(id -u) \
docker-compose -f docker-compose-dev.yaml up

我有一个 Dockerfile 和所有设置,但这不适用于我的 M1 机器。

每当我运行此命令时, docker buildx Baker -f env.hcl app -f docker-bake.hcl 我都会得到此输出。

 => [internal] load build definition from Dockerfile                                                                            0.1s
 => => transferring dockerfile: 32B                                                                                             0.1s
 => [internal] load .dockerignore                                                                                               0.0s
 => => transferring context: 34B                                                                                                0.0s
 => [internal] load metadata for docker.io/library/node:lts-buster-slim                                                         0.4s
 => [internal] load metadata for docker.io/library/golang:alpine3.11                                                            0.4s
 => [stage-1  1/11] FROM docker.io/library/node:lts-buster-slim@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0.0s
 => [internal] load build context                                                                                               0.0s
 => => transferring context: 4.47kB                                                                                             0.0s
 => [go_tmp 1/3] FROM docker.io/library/golang:alpine3.11@sha256:xxxxxxxxxxxxxxx  0.0s
 => https://raw.githubusercontent.com/datajoint/miniconda3-docker/master/utilities/startup.go                                   0.1s
 => CACHED [stage-1  2/11] RUN apt-get update && apt-get install wget -y                                                        0.0s
 => CACHED [stage-1  3/11] WORKDIR /home/node                                                                                   0.0s
 => CACHED [stage-1  4/11] COPY --chown=node:node ./package.json ./package-lock.json  /home/node/                               0.0s
 => CACHED [stage-1  5/11] RUN npm install                                                                                      0.0s
 => CACHED [go_tmp 2/3] ADD https://raw.githubusercontent.com/datajoint/miniconda3-docker/master/utilities/startup.go /startup  0.0s
 => CACHED [go_tmp 3/3] RUN cd / && go build startup.go                                                                         0.0s
 => CACHED [stage-1  6/11] COPY --from=go_tmp /startup /startup                                                                 0.0s
 => CACHED [stage-1  7/11] COPY ./docker-entrypoint.sh /docker-entrypoint.sh                                                    0.0s
 => CACHED [stage-1  8/11] RUN   chmod +x /docker-entrypoint.sh &&   chmod 4755 /startup                                        0.0s
 => CACHED [stage-1  9/11] COPY --chown=node:node ./tsconfig.json /home/node/                                                   0.0s
 => CACHED [stage-1 10/11] COPY --chown=node:node ./public  /home/node/public                                                   0.0s
 => CACHED [stage-1 11/11] COPY --chown=node:node ./src  /home/node/src                                                         0.0s
 => exporting to image                                                                                                          0.0s
 => => exporting layers                                                                                                         0.0s
 => => writing image sha256:xxxxxxxxxxxxxxxxx                                    0.0s

这是我的 env.hcl 文件的内容

PY_VER="3.8"

IMAGE="djbase"

DISTRO="alpine"

PHARUS_VERSION="$(cat pharus/pharus/version.py | tail -1 | awk -F\" '{print $2}')"

DJLABBOOK_VERSION="$(cat package.json | grep \"version\" | awk -F\" '{print $4}')"

HOST_UID="$(id -u)"

以及我的 docker-bake.hcl 的内容

variable "PY_VER" {
    default = "xxx"
}

variable "IMAGE" {
    default = "xxx"
}

variable "DISTRO" {
    default = "xxxxx"
}

variable "PHARUS_VERSION" {
    default = "$(cat xxxx/xxxx/xxxxn.py | tail -1 | awk -F\" '{print $2}')"
}

variable "DJLABBOOK_VERSION" {
    default = "$(cat package.json | grep \"version\" | awk -F\" '{print $4}')"
}

variable "HOST_UID" {
    default = "$(id -u)"
}

target "app" {
    args = {
        PY_VER = "${PY_VER}"
        HOST_UID = "${HOST_UID}"
    }
}

最佳答案

buildx Baker 并不是要取代 compose up,而是用于构建 docker 镜像。因此,它与 docker compose build 或只是 docker build 更具可比性。您想要使用 buildx 的地方是为了构建多个架构的镜像。

您的 M1 芯片遇到的问题很可能是您的 docker 镜像不适合在该架构 (linux/arm64) 上运行,因为它可能是为 x86 构建的 (linux/amd64)。

确保您已安装 Rosetta 2,并且您的系统应该能够模拟 x86 并运行您的镜像。检查docs here for more .

在 docker 下运行模拟镜像的速度很慢。所以我一直在做的是使用 bulidx 为多个架构构建镜像,然后您可以使用 docker compose 提取这些镜像。

# docker-bake.hcl
variable "platforms" {
  default = ["linux/amd64", "linux/arm64"]
}

group "default" {
  targets = [
    "my_image",
  ]
}

target "my_image" {
  dockerfile = "myimage.Dockerfile"
  tags = ["myrepo/myimage:latest"]
  platforms = platforms
}
# Command
docker buildx bake --push
# docker-compose.yml
version: '3.9'
services:
    dev:
        image: myrepo/myimage:latest
# Command
docker-compose up <app_name>

现在,您将为这两种架构推送一个 docker 镜像,并且 docker 会根据运行的系统自动选择正确的镜像。

您可能需要配置 buildx,请检查 docker multi-arch docs了解更多。

关于docker - 如何使用 docker buildx Baker 替代 docker-compose up?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70385356/

相关文章:

docker - Ubuntu Docker 容器权限被拒绝 StreamWriter

node.js -/bin/sh : sequelize: not found when I try to run express. js 应用程序与 docker-compose

php - 使用 PHP AMQP Lib 和 Docker 发布两次 RabbitMQ 消息

docker buildx "exec user process caused: exec format error"

docker - 在多节点 Docker 构建中,层缓存存储在哪里?缓存垃圾回收何时发生?

bash - 如何将命令行参数传递给docker-compose run?

docker - Docker CLI随机挂起几分钟

docker - 从docker-compose v.3文件启动docker命令

docker - 如何使用命名卷将数据从主机共享到容器?

.net - Docker Buildkit --mount=type=cache 用于缓存 .NET 6 的 Nuget 包