【问题标题】:Building docker amd64 images on mac M1 chip在 mac M1 芯片上构建 docker amd64 镜像
【发布时间】:2021-10-19 04:44:24
【问题描述】:

我正在尝试以两种方式在我的 mac M1 (arm64) 上构建一个 dockerfile(以下 dockerfile 的重要部分):

FROM erlang:24

# elixir expects utf8.
ENV ELIXIR_VERSION="v1.12.2" \
    LANG=C.UTF-8

RUN set -xe \
    && ELIXIR_DOWNLOAD_URL="https://github.com/elixir-lang/elixir/archive/${ELIXIR_VERSION}.tar.gz" \
    && ELIXIR_DOWNLOAD_SHA256="701006d1279225fc42f15c8d3f39906db127ddcc95373d34d8d160993356b15c" \
    && curl -fSL -o elixir-src.tar.gz $ELIXIR_DOWNLOAD_URL \
    && echo "$ELIXIR_DOWNLOAD_SHA256  elixir-src.tar.gz" | sha256sum -c - \
    && mkdir -p /usr/local/src/elixir \
    && tar -xzC /usr/local/src/elixir --strip-components=1 -f elixir-src.tar.gz \
    && rm elixir-src.tar.gz \
    && cd /usr/local/src/elixir \
    && make install clean \
    && find /usr/local/src/elixir/ -type f -not -regex "/usr/local/src/elixir/lib/[^\/]*/lib.*" -exec rm -rf {} + \
    && find /usr/local/src/elixir/ -type d -depth -empty -delete

.
.
.

# docker compose
RUN COMPOSE_URL="https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/docker-compose-latest" \
  && curl --silent --show-error --location --fail --retry 3 --output /usr/bin/docker-compose $COMPOSE_URL \
  && chmod +x /usr/bin/docker-compose \
  && docker-compose version

.
.
.
  1. 使用docker build -t test .

因为我试图在 arm64 芯片上构建 amd64(docker compose part)映像。我收到此错误:

> [ 8/25] RUN COMPOSE_URL="https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/docker-compose-latest"   && curl --silent --show-error --location --fail --retry 3 --output /usr/bin/docker-compose $COMPOSE_URL      && chmod +x /usr/bin/docker-compose          && docker-compose version:
#11 2.768 /lib64/ld-linux-x86-64.so.2: No such file or directory
------
Dockerfile:68
--------------------
  67 |     # docker compose
  68 | >>>  RUN COMPOSE_URL="https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/docker-compose-latest" \
  69 | >>>       && curl --silent --show-error --location --fail --retry 3 --output /usr/bin/docker-compose $COMPOSE_URL \
  70 | >>>       && chmod +x /usr/bin/docker-compose \
  71 | >>>       && docker-compose version
  72 |
--------------------
error: failed to solve: process "/bin/sh -c COMPOSE_URL=\"https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/docker-compose-latest\" \t && curl --silent --show-error --location --fail --retry 3 --output /usr/bin/docker-compose $COMPOSE_URL \t && chmod +x /usr/bin/docker-compose \t && docker-compose version" did not complete successfully: exit code: 255
  1. 使用docker buildx build --platform linux/amd64 -t test .

这应该可以解决我的不兼容问题并使用 qemu 模拟器构建映像。但我得到的与elixir (1. part of the dockerfile) 或 qemu 本身相当相关。

elixir 的 dockerfile 部分应该与这两种芯片兼容,我假设它是 qemu。这是错误消息:

> [ 2/25] RUN set -xe  && ELIXIR_DOWNLOAD_URL="https://github.com/elixir-lang/elixir/archive/v1.12.2.tar.gz"   && ELIXIR_DOWNLOAD_SHA256="701006d1279225fc42f15c8d3f39906db127ddcc95373d34d8d160993356b15c"         && curl -fSL -o elixir-src.tar.gz $ELIXIR_DOWNLOAD_URL       && echo "$ELIXIR_DOWNLOAD_SHA256  elixir-src.tar.gz" | sha256sum -c -   && mkdir -p /usr/local/src/elixir       && tar -xzC /usr/local/src/elixir --strip-components=1 -f elixir-src.tar.gz  && rm elixir-src.tar.gz         && cd /usr/local/src/elixir     && make install clean        && find /usr/local/src/elixir/ -type f -not -regex "/usr/local/src/elixir/lib/[^\/]*/lib.*" -exec rm -rf {} +        && find /usr/local/src/elixir/ -type d -depth -empty -delete:
#5 0.087 + ELIXIR_DOWNLOAD_URL=https://github.com/elixir-lang/elixir/archive/v1.12.2.tar.gz
#5 0.087 + ELIXIR_DOWNLOAD_SHA256=701006d1279225fc42f15c8d3f39906db127ddcc95373d34d8d160993356b15c
#5 0.088 + curl -fSL -o elixir-src.tar.gz https://github.com/elixir-lang/elixir/archive/v1.12.2.tar.gz
#5 0.163   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
#5 0.165                                  Dload  Upload   Total   Spent    Left  Speed
100   127    0   127    0     0    243      0 --:--:-- --:--:-- --:--:--   246
100 2402k  100 2402k    0     0  1331k      0  0:00:01  0:00:01 --:--:-- 1982k
#5 1.984 + echo 701006d1279225fc42f15c8d3f39906db127ddcc95373d34d8d160993356b15c  elixir-src.tar.gz
#5 1.984 + sha256sum -c -
#5 2.033 elixir-src.tar.gz: OK
#5 2.035 + mkdir -p /usr/local/src/elixir
#5 2.053 + tar -xzC /usr/local/src/elixir --strip-components=1 -f elixir-src.tar.gz
#5 2.193 + rm elixir-src.tar.gz
#5 2.209 + cd /usr/local/src/elixir
#5 2.209 + make install clean
#5 2.520 sys/unix/sys_signal_stack.c:269:sys_sigaltstack(): Internal error: Failed to set alternate signal stack
#5 2.521 qemu: uncaught target signal 6 (Aborted) - core dumped
#5 2.526 make: *** [Makefile:82: lib/elixir/src/elixir_parser.erl] Aborted
------
Dockerfile:7
--------------------
   6 |
   7 | >>> RUN set -xe \
   8 | >>>      && ELIXIR_DOWNLOAD_URL="https://github.com/elixir-lang/elixir/archive/${ELIXIR_VERSION}.tar.gz" \
   9 | >>>      && ELIXIR_DOWNLOAD_SHA256="701006d1279225fc42f15c8d3f39906db127ddcc95373d34d8d160993356b15c" \
  10 | >>>      && curl -fSL -o elixir-src.tar.gz $ELIXIR_DOWNLOAD_URL \
  11 | >>>      && echo "$ELIXIR_DOWNLOAD_SHA256  elixir-src.tar.gz" | sha256sum -c - \
  12 | >>>      && mkdir -p /usr/local/src/elixir \
  13 | >>>      && tar -xzC /usr/local/src/elixir --strip-components=1 -f elixir-src.tar.gz \
  14 | >>>      && rm elixir-src.tar.gz \
  15 | >>>      && cd /usr/local/src/elixir \
  16 | >>>      && make install clean \
  17 | >>>      && find /usr/local/src/elixir/ -type f -not -regex "/usr/local/src/elixir/lib/[^\/]*/lib.*" -exec rm -rf {} + \
  18 | >>>      && find /usr/local/src/elixir/ -type d -depth -empty -delete
  19 |
--------------------
error: failed to solve: process "/bin/sh -c set -xe \t&& ELIXIR_DOWNLOAD_URL=\"https://github.com/elixir-lang/elixir/archive/${ELIXIR_VERSION}.tar.gz\" \t&& ELIXIR_DOWNLOAD_SHA256=\"701006d1279225fc42f15c8d3f39906db127ddcc95373d34d8d160993356b15c\" \t&& curl -fSL -o elixir-src.tar.gz $ELIXIR_DOWNLOAD_URL \t&& echo \"$ELIXIR_DOWNLOAD_SHA256  elixir-src.tar.gz\" | sha256sum -c - \t&& mkdir -p /usr/local/src/elixir \t&& tar -xzC /usr/local/src/elixir --strip-components=1 -f elixir-src.tar.gz \t&& rm elixir-src.tar.gz \t&& cd /usr/local/src/elixir \t&& make install clean \t&& find /usr/local/src/elixir/ -type f -not -regex \"/usr/local/src/elixir/lib/[^\\/]*/lib.*\" -exec rm -rf {} + \t&& find /usr/local/src/elixir/ -type d -depth -empty -delete" did not complete successfully: exit code: 2

无论如何,我已经尝试使用 Rosetta 构建图像,但没有任何帮助。不过,该图像在我的 linux amd64 机器上构建得很好。

以下是我发现但对我没有多大帮助的相关问题:
1. way of building
2. way of building

我希望我已经提供了足够的信息,如果不问我 - 谢谢你的帮助。

【问题讨论】:

    标签: docker docker-compose elixir qemu apple-m1


    【解决方案1】:

    我建议你使用 erlang:23 - 因为 erlang:24 添加了 JIT 并且 qemu 非常不喜欢它。替代方案 - 查找 erlang:24 禁用 JIT 的版本

    【讨论】:

      【解决方案2】:

      我尝试了不同的方式在m1上构建amd64 docker镜像,发现最稳定的方式是:

      【讨论】: