Как мы снова получаем доступ к переменным, установленным в среде токса в другом блоке токса? - PullRequest
0 голосов
/ 09 марта 2020

Я использую tox- docker, и он устанавливает POSTGRES_5432_TCP_PORT в качестве переменной среды. Как мне снова получить доступ к этой переменной env? Я хочу сделать это, потому что я должен предоставить это команде pytest.

[tox]
skipsdist = True
envlist = py37-django22

[testenv]
docker = postgres:9
dockerenv =
    POSTGRES_USER=asd
    POSTGRES_DB=asd
    POSTGRES_PASSWORD=asd

setenv =
    PYTHONDONTWRITEBYTECODE=1
    DJANGO_SETTINGS_MODULE=app.settings.base

deps=-rrequirements.txt
     -rrequirements_dev.txt

commands =
    env
    python -c "print('qweqwe', {env:POSTGRES_5432_TCP_PORT:'default_port'})"
    pytest -sv --postgresql-port={env:POSTGRES_5432_TCP_PORT:} --cov-report html --cov-report term --cov=app -l --tb=long {posargs} --junitxml=junit/test-results.xml

здесь, POSTGRES_5432_TCP_PORT устанавливается tox- docker. но когда я пытаюсь получить доступ к нему внутри токсина, он недоступен. Но когда я выполняю команду env внутри tox, она печатает переменную.

py37-django22 docker: run 'postgres:9'
py37-django22 run-test-pre: PYTHONHASHSEED='480168593'
py37-django22 run-test: commands[0] | env
PATH=
TOX_WORK_DIR=src/.tox
HTTPS_PROXY=http://0000:8000
LANG=C
HTTP_PROXY=http://0000:8000
PYTHONDONTWRITEBYTECODE=1
DJANGO_SETTINGS_MODULE=app.settings.base
PYTHONHASHSEED=480168593
TOX_ENV_NAME=py37-django22
TOX_ENV_DIR=/.tox/py37-django22
POSTGRES_USER=swordfish
POSTGRES_DB=swordfish
POSTGRES_PASSWORD=swordfish
POSTGRES_HOST=172.17.0.1
POSTGRES_5432_TCP_PORT=32822
POSTGRES_5432_TCP=32822
VIRTUAL_ENV=.tox/py37-django22
py37-django22 run-test: commands[1] | python -c 'print('"'"'qweqwe'"'"', '"'"'default_port'"'"')'
qweqwe default_port
py37-django22 run-test: commands[2] | pytest -sv --postgresql-port= --cov-report html --cov-report term --cov=app -l --tb=long --junitxml=junit/test-results.xml

1 Ответ

0 голосов
/ 09 марта 2020

Если сценарий устанавливает переменную среды, этот envvar виден только этому процессу. Если она экспортирует переменную, переменная будет видима независимо от того, какие суб-оболочки этот скрипт может порождать. После завершения работы скрипта все envvars, установленные процессом оболочки, и любые дочерние процессы исчезнут, поскольку они существовали только в этом пространстве памяти.

Не уверен, что вы пытаетесь сделать, Docker не мое специальность, но 5432 является общим Postgres портом. Если вы пытаетесь предоставить его для pytest, вы можете сказать

POSTGRES_5432_TCP_PORT=5432 pytest <test_name>

или что-то на этот счет.

...