diff --git a/src/options/generate/generator.py b/src/options/generate/generator.py index 8ea9300..f3ef5fe 100644 --- a/src/options/generate/generator.py +++ b/src/options/generate/generator.py @@ -187,24 +187,24 @@ metas: tag_name=REQUIREMENTS_FILE_TAG, )[REQUIREMENTS_FILE_NAME] - # self.generate_and_persist_file( - # section_title='Generate Dockerfile', - # template=template_generate_apt_get_install, - # destination_folder=MICROSERVICE_FOLDER_v1, - # file_name_s=None, - # parse_result_fn=self.parse_result_fn_dockerfile, - # docker_file_wrapped=self.read_docker_template(), - # requirements_file_wrapped=self.files_to_string({ - # REQUIREMENTS_FILE_NAME: requirements_content, - # }) - # ) - - # docker file from curdir - shutil.copy( - src=os.path.join(os.path.dirname(__file__), 'static_files', 'microservice', 'Dockerfile'), - dst=MICROSERVICE_FOLDER_v1 + '/Dockerfile' + self.generate_and_persist_file( + section_title='Generate Dockerfile', + template=template_generate_apt_get_install, + destination_folder=MICROSERVICE_FOLDER_v1, + file_name_s=None, + parse_result_fn=self.parse_result_fn_dockerfile, + docker_file_wrapped=self.read_docker_template(), + requirements_file_wrapped=self.files_to_string({ + REQUIREMENTS_FILE_NAME: requirements_content, + }) ) + # # docker file from curdir + # shutil.copy( + # src=os.path.join(os.path.dirname(__file__), 'static_files', 'microservice', 'Dockerfile'), + # dst=MICROSERVICE_FOLDER_v1 + '/Dockerfile' + # ) + self.write_config_yml(microservice_name, MICROSERVICE_FOLDER_v1) print('\nFirst version of the microservice generated. Start iterating on it to make the tests pass...') @@ -215,14 +215,17 @@ metas: return f.read() def parse_result_fn_dockerfile(self, content_raw: str): + json_string = self.extract_content_from_result(content_raw, 'apt-get-packages.json', match_single_block=True) + packages = json.loads(json_string)['packages'] + docker_file_template = self.read_docker_template() - return {DOCKER_FILE_NAME: docker_file_template.replace('{{apt_get_packages}}', '{apt_get_packages}').format(apt_get_packages=content_raw)} + return {DOCKER_FILE_NAME: docker_file_template.replace('{{apt_get_packages}}', '{apt_get_packages}').format(apt_get_packages=packages)} def parse_result_fn_requirements(self, content_raw: str): content_parsed = self.extract_content_from_result(content_raw, 'requirements.txt', match_single_block=True) lines = content_parsed.split('\n') - lines = [line for line in lines if not any([pkg in line for pkg in ['jina', 'docarray', 'openai', 'pytest']])] + lines = [line for line in lines if not any([pkg in line for pkg in ['jina', 'docarray', 'openai', 'pytest', 'gpt_3_5_turbo_api']])] content_modified = f'''jina==3.15.1.dev14 docarray==0.21.0 openai>=0.26.0 @@ -322,7 +325,7 @@ pytest section_title='Debugging apt-get dependency issue', template=template_solve_apt_get_dependency_issue, destination_folder=next_microservice_path, - file_name_s=None, + file_name_s=['apt-get-packages.json'], parse_result_fn=self.parse_result_fn_dockerfile, system_definition_examples=[], summarized_error=summarized_error, diff --git a/src/options/generate/static_files/microservice/Dockerfile b/src/options/generate/static_files/microservice/Dockerfile index 3ba6f3a..190e8ff 100644 --- a/src/options/generate/static_files/microservice/Dockerfile +++ b/src/options/generate/static_files/microservice/Dockerfile @@ -1,5 +1,7 @@ FROM jinaai/jina:3.14.1-py39-standard +RUN apt-get update && apt-get install --no-install-recommends -y {{apt_get_packages}} && apt-get clean && rm -rf /var/lib/apt/lists/* + ## install requirements for the executor COPY requirements.txt . RUN pip install --compile -r requirements.txt diff --git a/src/options/generate/templates_user.py b/src/options/generate/templates_user.py index f3bd32a..aba7c60 100644 --- a/src/options/generate/templates_user.py +++ b/src/options/generate/templates_user.py @@ -157,13 +157,10 @@ template_generate_requirements = PromptTemplate.from_template( {code_files_wrapped} -Write the content of the requirements.txt file. -The requirements.txt file must include the following packages in that specified version: +Write the content of the requirements.txt file like this: +**requirements.txt** ``` -jina==3.15.1.dev14 -docarray==0.21.0 -openai>=0.26.0 -pytest +... ``` Add any more packages that are needed to run the code. You must not add gpt_3_5_turbo_api to the requirements.txt file. @@ -184,7 +181,17 @@ Name all packages which need to be installed via `apt-get install` in above Dock Note that you must not list apt-get packages that are already installed in the Dockerfile. Note that openai does not require any apt-get packages. -Output the packages that need to me placed at {{apt_get_packages}} as a white space separated list: +Note that you only list packages where you are highly confident that they are really needed. +Output the packages that need to me placed at {{apt_get_packages}} as json in the following format: +**apt-get-packages.json** +```json +{{"packages": ["", ""]}} +``` +Have in mind that the packages list can be empty like this: +**apt-get-packages.json** +```json +{{"packages": []}} +``` ''' ) diff --git a/test/test_generator.py b/test/test_generator.py index 877cc7a..6a5ad87 100644 --- a/test/test_generator.py +++ b/test/test_generator.py @@ -26,6 +26,11 @@ def test_generation_level_0(tmpdir): assert generator.generate() == 0 +# fixture +@pytest.fixture +def tmpdir(): + return 'microservice' + def test_generation_level_1(tmpdir): """ Requirements: