Jinja2 模板未使用 Docker 为 Cookiecutter 渲染

问题描述 投票:0回答:1

我正在尝试通过 Docker 容器使用

cookiecutter
生成项目模板,而我在
jinja2
文件值中提供的
cookiecutter.json
模板似乎无法正确渲染。

这样做的目标是允许任何人运行简单的 Docker 命令来生成模板,而无需先在其计算机上安装

cookiecutter

这是我的工作流程和输出。

设置

我有以下项目结构

mldev_template/
├── Dockerfile.cookiecutter
├── entrypoint.sh
├── cookiecutter.json
└── {{cookiecutter._project_name_snake_case}}/
    ├── Dockerfile

这些文件包含以下内容:

Dockerfile.cookiecutter

FROM python:3.10.8
RUN pip install cookiecutter==2.6.0

WORKDIR /workspace/mldev_template

COPY entrypoint.sh /workspace/mldev_template/entrypoint.sh
COPY entrypoint.sh /workspace/mldev_template/entrypoint.sh

RUN chmod +x /workspace/mldev_template/entrypoint.sh
ENTRYPOINT ["/workspace/mldev_template/entrypoint.sh"]

入口点.sh

#!/bin/bash

cookiecutter -v /workspace/mldev_template

cookiecutter.json

{
    "project_name": "My Awesome Project",
    "_project_name_snake_case": "{{ cookiecutter.project_name | lower | replace(' ', '_') }}"
}

我还尝试了

cookiecutter.project_name.lower().replace(' ', '_')
以及
jinja2-strcase
函数来代替这个
jinja2
模板,具有相同的结果。

{{cookiecutter._project_name_snake_case}}/Dockerfile

FROM python:3.10-slim
LABEL project="{{ cookiecutter._project_name_snake_case }}"

期望

我期望

jinja2
模板呈现为新生成的目录的目录名称,并在新生成的目录内的 Dockerfile 的
project
标签中呈现,均为蛇形大小写。

在下面的示例中,我在提示符下输入

Test Project
,因此我希望看到
test_project
作为目录名称,并在新生成的
project
中看到
Dockerfile
标签。

工作流程

我运行以下命令在本地计算机上构建 Docker 映像,然后以交互方式运行容器。这些命令是从顶级目录内部运行的。

docker build --no-cache -f Dockerfile.cookiecutter -t cookiecutter-runner .

docker run -it --rm -v $(pwd)/..:/workspace --entrypoint /bin/bash cookiecutter-runner

进入容器后,我运行

cookiecutter -v /workspace/mldev_template
,按照提示操作,并获得以下输出。

root@345df12673ac:/workspace/mldev_template# cookiecutter -v /workspace/mldev_template
DEBUG cookiecutter.config: User config not found. Loading default config.
DEBUG cookiecutter.hooks: hooks_dir is /workspace/mldev_template/hooks
DEBUG cookiecutter.hooks: No hooks/dir in template_dir
DEBUG cookiecutter.main: context_file is /workspace/mldev_template/cookiecutter.json
DEBUG cookiecutter.generate: Context generated is OrderedDict([('cookiecutter', OrderedDict([('project_name', 'My Awesome Project'), ('_project_name_snake_case', "{{ cookiecutter.project_name | lower | replace(' ', '_') }}")]))])
  [1/1] project_name (My Awesome Project): Test Project
DEBUG cookiecutter.main: context is OrderedDict([('cookiecutter', OrderedDict([('project_name', 'Test Project'), ('_project_name_snake_case', "{{ cookiecutter.project_name | lower | replace(' ', '_') }}")])), ('_cookiecutter', {'project_name': 'My Awesome Project'})])
DEBUG cookiecutter.utils: Making sure path exists (creates tree if not exist): /root/.cookiecutter_replay/
DEBUG cookiecutter.find: Searching /workspace/mldev_template for the project template.
DEBUG cookiecutter.find: The project template appears to be /workspace/mldev_template/{{ cookiecutter._project_name_snake_case }}
DEBUG cookiecutter.generate: Generating project from /workspace/mldev_template/{{ cookiecutter._project_name_snake_case }}...
DEBUG cookiecutter.generate: Rendered dir {{ cookiecutter.project_name | lower | replace(' ', '_') }} must exist in output_dir .
DEBUG cookiecutter.utils: Making sure path exists (creates tree if not exist): {{ cookiecutter.project_name | lower | replace(' ', '_') }}
DEBUG cookiecutter.generate: Project directory is /workspace/mldev_template/{{ cookiecutter.project_name | lower | replace(' ', '_') }}
DEBUG cookiecutter.hooks: hooks_dir is /workspace/mldev_template/hooks
DEBUG cookiecutter.hooks: No hooks/dir in template_dir
DEBUG cookiecutter.hooks: No pre_gen_project hook found
DEBUG cookiecutter.generate: Processing file Dockerfile
DEBUG cookiecutter.generate: Created file at /workspace/mldev_template/{{ cookiecutter.project_name | lower | replace(' ', '_') }}/Dockerfile
DEBUG cookiecutter.generate: Check Dockerfile to see if it's a binary
DEBUG cookiecutter.generate: Using detected newline character '\n'
DEBUG cookiecutter.generate: Writing contents to file /workspace/mldev_template/{{ cookiecutter.project_name | lower | replace(' ', '_') }}/Dockerfile
DEBUG cookiecutter.hooks: hooks_dir is /workspace/mldev_template/hooks
DEBUG cookiecutter.hooks: No hooks/dir in template_dir
DEBUG cookiecutter.hooks: No post_gen_project hook found

结果

创建了一个新目录,但新目录名为

{{ cookiecutter.project_name | lower | replace(' ', '_') }}
而不是
test_project
,并且其下面的 Dockerfile 如下所示

FROM python:3.10-slim
LABEL project="{{ cookiecutter.project_name | lower | replace(' ', '_') }}"

我还需要做些什么才能使这些

jinja2
模板使用
cookiecutter
正确渲染吗?我似乎在任何地方都找不到有关此的任何信息。这是我第一次使用
cookiecutter
jinja2
,所以我可能错过了一些超级简单的东西,但我似乎找不到使用 Docker 生成
cookiecutter
的示例,而且我似乎找不到其他人的
jinja2
模板无法正确渲染的示例。

我还验证了当我构建 Docker 映像时,运行

cookiecutter
的所有要求都已正确安装。

Package         Version Latest Version
MarkupSafe  2.1.5   2.1.5
PyYAML  6.0.1   6.0.1
arrow   1.3.0   1.3.0
binaryornot 0.4.4   0.4.4
certifi 2024.6.2    2024.6.2
chardet 5.2.0   5.2.0
charset-normalizer  3.3.2   3.3.2
click   8.1.7   8.1.7
cookiecutter    2.6.0   2.6.0
idna    3.7 3.7
jinja2  3.1.4   3.1.4
jinja2-strcase  0.0.2   0.0.2
markdown-it-py  3.0.0   3.0.0
mdurl   0.1.2   0.1.2
pip 23.0.1  24.0
pygments    2.18.0  2.18.0
python-dateutil 2.9.0.post0 2.9.0.post0
python-slugify  8.0.4   8.0.4
requests    2.32.3  2.32.3
rich    13.7.1  13.7.1
setuptools  58.1.0  70.0.0
six 1.16.0  1.16.0
text-unidecode  1.3 1.3
types-python-dateutil   2.9.0.20240316  2.9.0.20240316
urllib3 2.2.2   2.2.2
wheel   0.43.0  0.43.0
python-3.x docker jinja2 cookiecutter
1个回答
0
投票

我认为,你定义的路径没有被纠正,如果你定义

WORKDIR /workspace/mldev_template

所以,

Dockerfile.cookiecutter
应该是:

FROM python:3.10.8
RUN pip install cookiecutter==2.6.0

WORKDIR /workspace/mldev_template

COPY entrypoint.sh .
COPY entrypoint.sh .

RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.