在mac M1芯片上构建docker amd64镜像



我试图建立一个dockerfile在我的mac M1 (arm64)在两种方式(以下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组成部分)图像。我得到这个错误:

> [ 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模拟器构建映像。但我得到的与长生不老药(1)有关。(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机器上构建得很好。

以下是我发现的相关问题,但对我没有多大帮助:
构建方式
2。构建方式

我希望我提供了足够的信息,如果没有问我-谢谢帮助。

我尝试了在m1上构建amd64 docker映像的不同方法,并找到最稳定的方法是:

  • 使用UTM运行amd64 linux (https://mac.getutm.app/);
  • 使用该VM作为docker主机来构建;

我建议您使用erlang:23 -因为erlang:24添加了JIT, qemu非常不喜欢它。替代-查找erlang:24版本禁用JIT

最新更新