有时我们在编写docker文件时会出错。如果 Dockerfile 中有错误,docker 构建将会失败。
有时我们可能会忘记在 Dockerfile 中指定依赖项。让我们举个例子。
假设我有一个 python 脚本,可以截取任何网页(提供了 URL)的屏幕截图。
pytest
将在我的本地开发环境中通过。RUN
我忘记在 dockerfile 中指定将安装 chromium 和 chrome 驱动程序的命令。因此在容器内运行测试将会失败。(尽管docker build
会成功。)我想自动化构建 docker 镜像并在容器中运行测试的任务。
在本地机器上,我可以运行docker build -t myproj .
构建。
为了测试,我可以运行docker run -it myproj pytest
(如果我忘记添加RUN
安装 chromium 和 chromedriver,那么我的 pytest 将在容器内失败)
我希望我能够解释我的目的。
通常,在 github actions 中,python 源代码可以在 ubuntu、mac、windows 等上运行。除了不同的操作系统之外,我还想构建和测试我的 dockerfile。
我有一个像这样的 Dockerfile:
FROM python:3.9
WORKDIR /app
RUN apt-get update && apt-get upgrade -y
RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -
ENV PATH /root/.local/bin:$PATH
COPY pyproject.toml poetry.lock Makefile ./
COPY src ./src
COPY tests ./tests
RUN poetry install && poetry run pytest && make clean
CMD ["bash"]
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,测试将在构建期间运行。它可能会稍微减慢构建速度,但会确保我的代码在 Docker 容器中运行。
如果测试在我的本地计算机中通过,并不意味着它们也会在 docker 容器中通过。
假设我在代码中添加了一个使用 chromedriver 或 ffmpeg 二进制文件的功能,该功能存在于我的系统中,因此测试将在我的系统中通过。
但是,假设我忘记在 Dockerfile 中安装这些依赖项,那么 docker 构建将会失败(因为测试在构建期间运行)
做我想做的事情的标准方法是什么?
我的 Dockerfile 好吗?或者我应该做一些不同的事情?
我有一个 python 包,用于poetry
依赖管理和打包。
在我的本地环境中,我正在使用tox
多个 python 版本来测试包。
每次有推送或拉取请求时,如何使用 GitHub 操作来测试我的包?
我尝试过的事情:
pip
和安装requirements.txt
,但我正在使用诗歌)pip
诗歌,不推荐使用诗歌,因为它可能会与我的应用程序依赖项发生冲突,请参阅问题)pytest
(github操作的)每个矩阵中运行,这个操作似乎违背了tox的目的)我想在 gh-actions 中测试我的 python 代码。
在我的情况下,我实际应该使用什么?
最佳做法是什么?和最优化的工具
我有一个简单的脚本,每 2 秒打印一次 hello。
# entry.py
import time
while True:
print("hello")
time.sleep(2)
Run Code Online (Sandbox Code Playgroud)
我有一个运行此脚本的超简单 docker 文件。
FROM python:3.9
COPY entry.py entry.py
CMD python entry.py
Run Code Online (Sandbox Code Playgroud)
首先我构建docker镜像:
FROM python:3.9
COPY entry.py entry.py
CMD python entry.py
Run Code Online (Sandbox Code Playgroud)
现在我用这个-it
选项运行它,它按预期工作。
$ docker build -t dtest .
Run Code Online (Sandbox Code Playgroud)
但是当我在分离模式下运行它,然后尝试查看日志时,我什么也看不到。
$ docker run -it dtest
# hello printed to screen every two seconds
Run Code Online (Sandbox Code Playgroud) 我正在使用python 3.9.5
, 和PyYaml 5.4.1
.
t.yml
我有一个包含以下内容的文件。
- \xe2\xac\x86\xef\xb8\x8f\n
Run Code Online (Sandbox Code Playgroud)\n我编写了一个简单的 python 代码,用于读取 yaml 文件并将其转储回来。
\nimport yaml\n\nwith open("t.yml") as file:\n con = yaml.safe_load(file)\n print(con)\n with open("t.yml","w") as file:\n yaml.dump(con,file)\n
Run Code Online (Sandbox Code Playgroud)\n代码的输出是:
\n[\'\xe2\xac\x86\xef\xb8\x8f\']\n
Run Code Online (Sandbox Code Playgroud)\n转储yaml后,t.yml
文件变成这样:
- "\\u2B06\\uFE0F\\U0001F622"\n
Run Code Online (Sandbox Code Playgroud)\n如何以与我加载的完全相同的格式转储表情符号?
\n在 Makefile 里面我有这样的:
release:
version=$$(poetry version | cut -f2 -d " ")
echo "release $$version"
Run Code Online (Sandbox Code Playgroud)
如果我运行,我的终端中的语句将毫无问题地运行。
release:
version=$$(poetry version | cut -f2 -d " ")
echo "release $$version"
Run Code Online (Sandbox Code Playgroud)
但如果我跑的话
> version=$(poetry version | cut -f2 -d " ")
> echo "release $version"
release 0.0.2
Run Code Online (Sandbox Code Playgroud)
您可以在输出中看到release
版本号旁边。未显示。