У меня Python3 приложение запускается внутри Docker контейнера; и когда контейнер Docker запускается, он принимает аргументы, которые передаются приложению Python3. Довольно простой и хорошо работает.
Dockerfile:
FROM ubuntu:latest
MAINTAINER name <email>
RUN apt-get -yqq update \
&& apt-get install -yqq python3-pip python3-dev \
&& apt-get install -yqq liblzo2-2 \
&& apt-get install -yqq openvpn \
&& apt-get install -yqq net-tools \
&& cd /usr/local/bin \
&& ln -s /usr/bin//python3 python \
&& pip3 install --upgrade pip
RUN pip3 install --upgrade paramiko
ADD vtn.py /vtund/vtn.py
ADD vtund /vtund/vtund
ADD vtund.conf /vtund/vtund.conf
WORKDIR /vtund/
# run the command
ENTRYPOINT ["python", "./vtn.py"]
Основы Python3 приложения; обратите внимание, что большая часть кода vtun была удалена, чтобы сохранить его в чистоте, и это не имеет отношения к вопросу. Любой, кто интересуется vtun, не стесняйтесь спрашивать, и я рад поделиться:
import os
import sys
import subprocess
import time
import random
import os
import paramiko
import datetime
def open_vtun (t_name):
// Not critical to question; basically opens client to server tunnel
def get_tun_other_end ():
// Not critical to question; determines IP address of other end of tunnel
def do_tunnel_stuff (proc, t_name, nodetype):
// Not critical to question; emulates basic file transfer (SFTP) across tunnel
def send_package(ip_addr, t_name, nodetype):
// Not critical to question; sends test package across tunnel
def validate_package(ip_addr, t_name, p_name):
// Not critical to question; validates package successfully sent
def purge_package (ip_addr, t_name, p_name):
// Not critical to question; deletes package
def close_tunnel (proc):
// Not critical to question; closes tunnel
def main():
pcounter = 1
tunnel_proc = open_vtun(sys.argv[1])
while True:
do_tunnel_stuff (tunnel_proc, sys.argv[1], sys.argv[2])
if (pcounter == (int(sys.argv[3]))):
break
pcounter += 1
close_tunnel (tunnel_proc)
if __name__ == "__main__":
sys.exit(main())
Построение контейнера просто:
docker build -t <userid>/vtn .
Запуск экземпляра контейнера (это важная часть, пройдено 3 аргумента):
docker run --privileged <userid>/vtn nodename datalevel iterations
Передано три аргумента:
nodename - a name for the node to be emulated (ie. TSH00014)
datalevel - how busy the emulated node will be (ie. small, medium, large); basically defines how much data is passed across the tunnel per iteration
iterations - number of transfers before closing the container (0 - never ends, or # of number of transfers)
Наконец-то дойдем до вопроса (извините за количество подтверждающих данных). Я хочу запустить контейнеры, используя Docker SDK для Python.
pip install docker
import docker
client = docker.from_env()
Кажется, я могу запустить контейнер следующим образом:
client.containers.run("<userid>/vtn", detach=True)
Однако я не могу понять, как передать три аргумента, как я делаю с 'docker оператор 'run?
Я пробовал очевидное включение аргументов в оператор:
client.containers.run("<userid>/vtn arg1 arg2 arg3", detach=True)
, но безуспешно.