Я хочу разрабатывать приложения на моей машине с 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