Запуск образов Docker на Raspberry, созданных на Windows - PullRequest
0 голосов
/ 16 мая 2019

Я хочу разрабатывать приложения на моей машине с Windows, используя докер, а затем отправлять их на мой raspberry pi 3B + (и запускать их в рое).

Однако я не могу этого сделать:

Я установил helloWorld в python на моем Windows-компьютере:

app.py

from flask import Flask
import os
import socket

app = Flask(__name__)

@app.route("/")
def hello():

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>"

    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

needs.txt

Flask

Dockerfile

FROM python
WORKDIR /app
COPY . /app
RUN pip install --trusted-host pypi.python.org -r requirements.txt
EXPOSE 80
ENV NAME World
CMD ["python", "app.py"]

Запуск

docker build --tag=hello .
docker run -p 4000:80 hello

работает как чудо, и даже мои нажатия и получение его из моего реестра (работает на Raspberry) через

docker build -t somehostname/hello .
docker push somehostname/hello
//delete local container and image
docker run -p 4000:80 somehostname/hello

работает нормально.

Однако, когда я ssh в мою малину 3B + и запустить

sudo docker pull somehostname/hello
sudo docker run -p 4000:80 somehostname/hello

я получаю:

standard_init_linux.go:207: exec user process caused "exec format error"

Я читал об этой ошибке, и кажется, что это проблема с разницей в архитектуре: моя машина Windows использует x86-64, в то время как Raspberry 3B + использует ARM.

Однако изображение Python я 'м построено на обеих архитектурах, поэтому докер должен вытащить правильное изображение.Копирование кода на мою малину, сборка образа и запуск контейнера с точно такими же строками кода работает нормально.

Я также читал о манифесте Docker, и это экспериментальная функция, но я не понимаю, как это будетпомогите мне, так как все, что я использую (я думаю, это только python), уже является многоархатным, поэтому докер должен сам справиться с этим.

Есть ли способ запустить и запустить мое приложение, не копируя код в мою малину?

Обновление: Вывод из малины

user@somehostname:~ $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            2                   c99846f41d25        2 months ago        22.1MB
user@somehostname:~ $ sudo docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2af9cb1df776        registry:2          "/entrypoint.sh /etc…"   2 minutes ago       Up About a minute   0.0.0.0:5000->5000/tcp   registry
user@somehostname:~ $ sudo docker pull somehostname/hello:latest
latest: Pulling from hello
c5e155d5a1d1: Pull complete
221d80d00ae9: Pull complete
4250b3117dca: Pull complete
3b7ca19181b2: Pull complete
425d7b2a5bcc: Pull complete
dc3049ff3f44: Pull complete
472a6afc6332: Pull complete
5f79c90f8d7c: Pull complete
1051ee813012: Pull complete
38d05a77ad85: Pull complete
fe3cbf1eaf8a: Pull complete
c1e865e5779d: Pull complete
Digest: sha256:f7b31fff3116ef6621bf96fead8858ceb0768b502b2f3b221ab0f52cfc8039eb
Status: Downloaded newer image for somehostname/hello:latest
user@somehostname:~ $ sudo docker run -p 4000:80 somehostname/hello
standard_init_linux.go:207: exec user process caused "exec format error"
user@somehostname:~ $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
somehostname/hello   latest              d7472edad23e        About an hour ago   938MB
registry            2                   c99846f41d25        2 months ago        22.1M
user@somehostname:~ $ sudo docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2af9cb1df776        registry:2          "/entrypoint.sh /etc…"   11 minutes ago      Up 11 minutes       0.0.0.0:5000->5000/tcp   registry

1 Ответ

0 голосов
/ 16 мая 2019

Почти все, что вы написали, правильно, но я уверен, что это неправда, что образ Python является кросс-архитектурным, и вы должны найти образ Python, который работает на используемом вами устройстве Raspberry Pi.

IIRC 3s отличается архитектурой ARM от нулей, поэтому будьте осторожны, вы получите правильную.

Значение exec format errror, которое вы включаете, является сильным показателем этого.

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