Цепная команда в makefile для подключения к контейнеру postgres через IP - PullRequest
1 голос
/ 16 марта 2020

Я создал postgres контейнер, который работает отдельно.

Я хотел бы иметь возможность создать команду в файле Makefile make psql, где я могу подключиться с моего хост-компьютера к контейнеру через psql и проверить правильность вставки данных.

Я борюсь с тем, как составить команду makefile. Пока я получил:

Makefile

PG_CONTAINER=project_ch_pg_run_1

test_ip_1:
        docker exec -it project_ch_pg_run_1 hostname -i


test_ip_2:
        docker exec -it $(PG_CONTAINER) hostname -i

test_ip_3:
        IP=$$(docker exec -it $(PG_CONTAINER) hostname -i); \
        echo "Here's the IP of the container:$(IP)"

pslq:
        IP=$$(docker exec -it project_ch_pg_run_1 hostname -i); \
        psql postgres://ch_user:ch_pass@$(IP):5432/ch_dib


Результаты:

1 работает отлично.

make test_ip_1

docker exec -it project_ch_pg_run_1 hostname -i
192.168.96.2

2 работает подстановка переменных.

docker exec -it project_ch_pg_run_1 hostname -i
192.168.96.2

3 сохранение результата команды в IP переменной и выполнение подстановки не работает.

IP=$(docker exec -it project_ch_pg_run_1 hostname -i); \
echo "Here's the IP of the container:"
Here's the IP of the container:

4 сохранение результата команды в IP переменная и использовать ее для составления pg URI не работает.

IP=$(docker exec -it project_ch_pg_run_1 hostname -i); \
psql postgres://ch_user:ch_pass@:5432/ch_dib
psql: error: could not connect to server: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Makefile:15: recipe for target 'psql' failed
make: *** [psql] Error 2

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

1 Ответ

1 голос
/ 16 марта 2020

Вы должны помнить разницу между make переменными и shell переменными.

Здесь:

test_ip_3:
        IP=$$(docker exec -it $(PG_CONTAINER) hostname -i); \
        echo "Here's the IP of the container:$(IP)"

You правильно избежать вызова программы docker, используя $$(...), чтобы этот синтаксис не считался переменной make.

Но затем вы устанавливаете shell переменную IP, и в следующая строка, которую вы используете $(IP), которая является ссылкой на make переменную IP, которую вы никогда не устанавливали.

Вам необходимо использовать:

test_ip_3:
        IP=$$(docker exec -it $(PG_CONTAINER) hostname -i); \
        echo "Here's the IP of the container:$$IP"

для печати значения shell variable IP.

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