【发布时间】: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