Сборка docker не выполняется командой RUN в Ubuntu 16.04, но не 18.04 с той же версией Docker - PullRequest
0 голосов
/ 18 января 2019

Я успешно запускаю следующий 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: Output

На обеих машинах установлена ​​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 внутри образа.

1 Ответ

0 голосов
/ 22 января 2019

Оказывается, qemu-arm-static не так портативен, как я сначала подумал. Когда вы устанавливаете qemu-user-static, в ядро ​​добавляется отображение, чтобы оно понимало, что оно должно использовать qemu для интерпретации этой архитектуры, точно так же, как в комментарии выше. Я не знал, что это случилось под капотом.

Таким образом, есть две альтернативы для решения этой проблемы:

sudo apt install qemu-user-static

или

mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc  
echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:' > /proc/sys/fs/binfmt_misc/register  

Источник: https://www.balena.io/blog/building-arm-containers-on-any-x86-machine-even-dockerhub/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...