Я успешно запускаю следующий Dockerfile на моей машине с Ubuntu 18.04.01:
FROM arm32v7/openjdk:8-jdk-slim
WORKDIR /app
COPY qemu-arm-static /usr/bin/qemu-arm-static
COPY ./target/edge-0.0.1-SNAPSHOT.jar ./app.jar
COPY ./config/ ./config
RUN groupadd --gid 1337 moduleuser && \
useradd --uid 1337 --gid moduleuser --shell /bin/bash --create-home moduleuser
RUN mkdir -p /var/opt
RUN chown moduleuser:moduleuser -R /var/opt
USER moduleuser
ENTRYPOINT ["java","-jar","./app.jar"]
Однако, когда я пытаюсь построить его в нашей среде CI, все узлы имеют 16.04, и я не могу запустить его в этих средах. Вывод команды, запущенной в 16.04, выглядит следующим образом:
$ sudo docker build -f Dockerfile.arm32v7 .
Sending build context to Docker daemon 32.87MB
Step 1/10 : FROM arm32v7/openjdk:8-jdk-slim
---> e5f4973cadb1
Step 2/10 : WORKDIR /app
---> Using cache
---> 44da7413978b
Step 3/10 : COPY qemu-arm-static /usr/bin/qemu-arm-static
---> Using cache
---> ca8c3bde0d92
Step 4/10 : COPY ./target/edge-0.0.1-SNAPSHOT.jar ./app.jar
---> Using cache
---> 90267cfe2fe1
Step 5/10 : COPY ./config/ ./config
---> Using cache
---> 1612aca9fa90
Step 6/10 : RUN groupadd --gid 1337 moduleuser && useradd --uid 1337 --gid moduleuser --shell /bin/bash --create-home moduleuser
---> Running in 7a29d218f15e
standard_init_linux.go:207: exec user process caused "exec format error"
The command '/bin/sh -c groupadd --gid 1337 moduleuser && useradd --uid 1337 --gid moduleuser --shell /bin/bash --create-home moduleuser' returned a non-zero code: 1
Для справки, вот результат успешной сборки 18.04:
$ docker build -f ./Dockerfile.arm32v7 .
Sending build context to Docker daemon 32.85MB
Step 1/10 : FROM arm32v7/openjdk:8-jdk-slim
---> e5f4973cadb1
Step 2/10 : WORKDIR /app
---> Using cache
---> b8dc45ea966c
Step 3/10 : COPY qemu-arm-static /usr/bin/qemu-arm-static
---> Using cache
---> 43f2b39b8455
Step 4/10 : COPY ./target/edge-0.0.1-SNAPSHOT.jar ./app.jar
---> Using cache
---> bce9640496a9
Step 5/10 : COPY ./config/ ./config
---> Using cache
---> 70c4f5ab3cd1
Step 6/10 : RUN groupadd --gid 1337 moduleuser && useradd --uid 1337 --gid moduleuser --shell /bin/bash --create-home moduleuser
---> Using cache
---> 862b0e48f546
Step 7/10 : RUN mkdir -p /var/opt
---> Using cache
---> 55545e275209
Step 8/10 : RUN chown moduleuser:moduleuser -R /var/opt
---> Using cache
---> 9a5e061b4b84
Step 9/10 : USER moduleuser
---> Using cache
---> 8b049ddef6a6
Step 10/10 : ENTRYPOINT ["java","-jar","./app.jar"]
---> Using cache
---> 433e7e20be3a
Successfully built 433e7e20be3a
Если я начну интерактивный сеанс на компьютере 16.04 с изображением, на котором arm32v7/openjdk:8-jdk-slim
основан на использовании sudo docker run -it debian:stretch-slim
, я могу успешно запускать команды по отдельности, например:
root@557efbe64410:/# groupadd --gid 1337 moduleuser
root@557efbe64410:/# useradd --uid 1337 --gid moduleuser --shell /bin/bash --create-home moduleuser
Но когда я запускаю команду, которая вызывает ошибку из сборки, я вместо этого использую команду из команды useradd:

На обеих машинах установлена Docker версии 18.09.1, сборка 4c52b90.
Я в растерянности, я не могу понять, что происходит не так. Любая помощь будет принята с благодарностью.
Дополнительная информация по вопросам в комментариях:
16,04
$ docker system info --format '{{.Architecture}}'
x86_64
$ uname -m
x86_64
18,04
$ docker system info --format '{{.Architecture}}'
x86_64
$ uname -m
x86_64
На машине 18.04 установлено множество других двоичных файлов qemu. Я добавил с ними суть здесь . Однако у меня сложилось впечатление, что qemu-arm-static может работать автономно и не зависеть ни от каких других двоичных файлов.
Я не использую утилиты binfmt, я просто эмулирую ARM, используя qemu внутри образа.