LINUX.ORG.RU

Докеропроблемы

 ,


0

2

Есть простейший скриптик, вот он:

#!/usr/bin/env python3

import sys
import subprocess

list_of_files = []
list_of_files += sys.argv[1:]
if not sys.stdin.isatty():
    list_of_files += sys.stdin.read().splitlines()


phpcs = ['./vendor/bin/phpcs', '-d', 'memory_limit=-1', '--encoding=utf-8', '-n', '-p']
phplinter = ['php', '-l', '-d', 'display_errors=0']


if len(list_of_files) == 0:
    print('No files to check')
    exit(0)
else:
    print('Changed files:')
    for item in list_of_files:
        print(item)


print("Running phpcs")
subprocess.run(phpcs + list_of_files, check=True)


print('Running PHP Linter')
for item in list_of_files:
    subprocess.run(phplinter + [item], check=True)

Я использую этот скрипт в качестве entrypoint в докере. Когда я скармливаю ему список файлов через stdin локально, то всё работает. А когда делаю тоже самое через докер, то всё падает, потому что какого-то чёрта лист, который должен был получиться в list_of_files, получается сплошной строкой. Что я делаю не так и как сделать правильно?



Последнее исправление: u0000 (всего исправлений: 1)

Тож самое, но в более простом варианте:

#!/usr/bin/env python3
import sys
list_of_files = []
list_of_files += sys.argv[1:]

if not sys.stdin.isatty():
    list_of_files += sys.stdin.read().splitlines()

print("list_of_files: ", list_of_files)
[cF6gkG@XQDwWcVtP7Qt ~]$ cat ./file 
One from file
Two from file
Three from file
[cF6gkG@XQDwWcVtP7Qt ~]$ ./test.py 1 2 2 3 < ./file 
list_of_files:  ['1', '2', '2', '3', 'One from file', 'Two from file', 'Three from file']
u0000
() автор топика

Покажи еще докерфайл и расскажи, как ты там что-то скармливаешь «в докере».

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Докерфайл:

FROM откуда надо:main AS deps

LABEL build=yes

WORKDIR /var/www/html

COPY --from=composer /usr/bin/composer /usr/bin/composer

COPY composer.json /var/www/html/
RUN set -e \
    && composer install --dev -d /var/www/html

COPY куча директорий куда надо

COPY phpstan-baseline.neon /var/www/html/phpstan-baseline.neon
COPY phpstan.neon /var/www/html/phpstan.neon
COPY phpcs.xml /var/www/html/phpcs.xml

COPY test.py /test.py

ENTRYPOINT ["/test.py"]

А скармливаю примерно так, это должно создавать портянку с последними изменёнными файлами:

#!/bin/bash

# PROJECT=`php -r "echo dirname(dirname(dirname(realpath('$0'))));"`
echo $0;
PROJECT="$(pwd)"
echo $PROJECT;
echo $0;
FILES=$(git diff --cached --name-only --diff-filter=ACMR HEAD | grep \.php$)

if [ "$FILES" != "" ]; then

	echo -e "\033[0;32m"Stash your not staged code..."\033[0m"
	git stash push -k -u -m 'Unstaged changes and untracked files'

	pushd "$(pwd)" || exit 1
	cd "$PROJECT" || exit 1
	commit_file="/tmp/git-commit-files-$RANDOM"
	echo $FILES > $commit_file
	docker-compose --env-file ../../.env --profile test run -T test < $commit_file
	exit_code=$?
	rm -f $commit_file
	popd || exit 1
	rm -f /tmp/git-commit-list

	if [ "$exit_code" != 0 ]; then
		echo -e "\033[0;31m"Check and fix error that you have in your code."\033[0m"
		exit 1
	fi
fi
exit $?
u0000
() автор топика
Ответ на: комментарий от u0000

А зачем через docker-compose запускать, не просто через docker? Скрипт-то простой, без зависимостей.

Для начала я бы через docker run -i попробовал.

emorozov
()
Ответ на: комментарий от emorozov

Затем, что это часть докер-композа для разрабов, и короче, так проще на порядок.

К сожалению отдельно докером не подойдёт.

u0000
() автор топика
Ответ на: комментарий от u0000

echo $FILES > $commit_file

Это точно то что ты хотел?

cobold ★★★★★
()

Попробуй в качестве энтри использовать баш скрипт, а не питон и отлогируй в нём передачу всех параметров, правильно ли они передаются

menangen ★★★★★
()

Вместо:

echo $FILES > $commit_file

попробуй:

echo "$FILES" > $commit_file
vinvlad ★★
()
Ответ на: комментарий от u0000

А у тебя в $commit_file файлы разделены по переводу строки?

Да

Ну раз «Да», то надо понимать разницу в Bash между $FILES и "$FILES". В первом случае команда echo выводит содержимое переменной FILES одной строкой, а внутренние символы перевода строки просто воспринимаются как разделители аргументов команды и отбрасываются.

vinvlad ★★
()
Ответ на: комментарий от u0000

Я бы просто адаптировал питон скрипт под файлы разделенные пробелами. У тебя там файлы у которых в названии есть пробелы или почему нужно непременно на \n ориентироватья?

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

Их так гит выплёвывает. На самом деле без разницы как делать, мне просто надо чекать файлы которые поменялись, перед коммитом. Ну и в общем было принято решение написать вот этот ужас. Но я почти уверен, это не самое лучшее решение.

u0000
() автор топика
Ответ на: комментарий от u0000
list_of_files = sys.argv[1:]
if not sys.stdin.isatty():
    list_of_files.extend(
        filter(
            lambda line: line != ""
            sys.stdin.read().replace('\n', ' ').split(' ')
        )
    )

Будет работать как и \n так и с пробелами, ну или чем там у тебя после echo разделяется. Сломается если только у тебя в имени файла будет пробел

Aswed ★★★★★
()
Последнее исправление: Aswed (всего исправлений: 1)
Ответ на: комментарий от Aswed

Совсем забыл про filter(). Да, это помогло. Только там запятая потеряна.

u0000
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.