Настройте контейнер docker как переменную среды в другом контейнере - PullRequest
0 голосов
/ 28 мая 2020

У меня есть контейнер docker, который выполняет octave-cli, я хочу иметь этот исполняемый файл в качестве переменной среды в другом контейнере, чтобы я мог запускать его с помощью сценария python.

Я использую библиотеку oct2py в моем python скрипте, для которого требуется переменная окружения с исполняемым файлом октавы. В последней версии октавы не требуется PPA, поэтому я нашел изображение октавы docker (mtmiller / octave), которое хорошо работает с моими файлами .m. Теперь я хочу, чтобы он был доступен в моем контейнере python, чтобы сценарий работал.

Пример скрипта октавы

function hello()
    printf("hello,world!")
endfunction

Python скрипт

from oct2py import octave
octave.add('path/to/octavefile')
octave.hello()

Вывод

hello,world!

Требование для запуска выше python script

У вас должен быть установлен GNU Octave и переменная среды PATH. В качестве альтернативы вы можете установить переменную среды OCTAVE_EXECUTABLE или OCTAVE, которая указывает на сам исполняемый файл octave-cli.

Теперь у меня есть mtmiller / octave, который выполняет октаву. Как установить его в ПУТЬ контейнера python?

1 Ответ

0 голосов
/ 28 мая 2020

Я подозреваю, что octave предлагает пакет веб-API ... но я понятия не имею об этом, но вы можете запустить легкий flask сервер api на своем сервере octave

octave docker image

octave-server.py

import flask
import subprocess
from oct2py import octave
octave.add('path/to/octavefile')

app = flask.Flask(__name__)
@app.route("hello.m")
def hello_fn_call():
    users_name = flask.request.args.get("name")
    return json.dumps(octave.hello(users_name))

if __name__ == "__main__":
    # you should really serve this with nginx + gunicorn or something
    app.run(debug=True)

python docker изображение

octave_rest.py

import requests
def say_hello(username):
    return requests.get("http://other-image:5000/hello.m",{"name":username}).json()
if __name__ == "__main__":
    print(say_hello("BOB"))
    # something like "Hello, Bob"

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

from contextlib import redirect_stdout # py3.4+ only
import io

...

@app.route("hello.m")
def hello_fn_call():
    users_name = flask.request.args.get("name")    
    f = io.StringIO()
    with redirect_stdout(f):
        hello(users_name) # capture stdout
    return json.dumps(f.getvalue())
...