【问题标题】:Yaml merging from docker using a python script使用 python 脚本从 docker 合并 Yaml
【发布时间】:2021-03-25 03:18:16
【问题描述】:

我想将来自 repo 的多个 Yaml 文件合并到一个文件中,以便在容器上使用它。

我做了以下脚本,效果很好:

from os import path, walk, getenv
import yaml
import locale

def mergeYaml(directory):
    all_ = []

    for root, dirs, files in walk(directory):
        for dir_ in dirs:
            for root2, dirs2, files2 in walk(root+"/"+dir_):
                for file_ in files2:
                    with open("{}/{}".format(root2, file_), 'r', encoding="utf8") as f:
                        all_.append(yaml.safe_load(f))

    return all_
    

if __name__ == "__main__":
    base = getenv("DIRECTORY", "/repo")

    if(not path.exists("./device-type.yml")):
        res = mergeYaml(base)

        with open("./device-type.yml", 'w') as file:
            yaml.dump(res, file, sort_keys=True, explicit_start=True)

这很好用,因为我只有一个 device-type.yml 文件,我的所有 .yaml 都是一个数组项。


现在,我需要从 Docker 映像中完成此操作,因此我创建了以下 Dockerfile:

# Build image
FROM alpine/git as git

WORKDIR /repo
RUN git clone --single-branch -- https://URL /repo

# Final image 
FROM python:3-slim

ENV PYTHONIOENCODING=utf-8
##
#
COPY --from=git /repo /repo
WORKDIR /app
ADD main.py app.py
##
RUN pip install --no-cache-dir pyaml
RUN ["python3","-u","app.py"]
##
#

构建此生成以下错误:

Traceback (most recent call last):
  File "/app/app.py", line 22, in <module>
    res = mergeYaml(base)
  File "/app/app.py", line 13, in mergeYaml
    all_.append(yaml.safe_load(f))
  File "/usr/local/lib/python3.9/site-packages/yaml/__init__.py", line 162, in safe_load
    return load(stream, SafeLoader)
  File "/usr/local/lib/python3.9/site-packages/yaml/__init__.py", line 112, in load
    loader = Loader(stream)
  File "/usr/local/lib/python3.9/site-packages/yaml/loader.py", line 34, in __init__
    Reader.__init__(self, stream)
  File "/usr/local/lib/python3.9/site-packages/yaml/reader.py", line 85, in __init__
    self.determine_encoding()
  File "/usr/local/lib/python3.9/site-packages/yaml/reader.py", line 124, in determine_encoding
    self.update_raw()
  File "/usr/local/lib/python3.9/site-packages/yaml/reader.py", line 178, in update_raw
    data = self.stream.read(size)
  File "/usr/local/lib/python3.9/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 11: invalid continuation byte

我尝试了很多东西,比如强制 UTF8(但我假设这是由默认值应用的,因为我在新的 python:3-slim 图像时检查了 env LANG=C.UTF-8。

【问题讨论】:

    标签: python docker merge yaml dockerfile


    【解决方案1】:

    您使用git clone 初始化/repo 的内容,从而生成.git 文件夹。 Python 的os.walk 包含隐藏文件,因此它会下降到.git 文件夹并尝试在那里解析文件。

    您可以这样做不克隆,而只是获取分支的内容:

    git archive --remote=https://URL HEAD | tar -x -C /repo
    

    或者,您可以过滤您的目录以查找 .git 或脚本中通常隐藏的目录,或者过滤文件以获取扩展名。

    为了更好地调试,您可以打印出您的脚本尝试处理的文件。

    【讨论】:

    • 太棒了,没有考虑 .git 问题,谢谢!
    猜你喜欢
    • 2010-10-23
    • 2018-03-22
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    相关资源
    最近更新 更多