我已经设置了一个容器来运行一些 python 脚本,但是当我尝试从主机运行它们时 使用“docker exec”会引发错误 -
<块引用>OCI 运行时执行失败:执行失败:container_linux.go:370:导致启动容器进程:没有这样的文件或目录:未知
但是,如果我打开容器的外壳,我可以清楚地看到我的脚本在那里,我什至可以运行它。
Docker 文件:
2p^2
生成文件:
FROM python:3.7.1
WORKDIR /regex_locator
COPY ./py_code/req.txt ./proj/req.txt
RUN pip install -r ./proj/req.txt
CMD ["/bin/bash"]
提前致谢!
答案 0 :(得分:1)
我建议在这里使用普通的 Python 虚拟环境。这使用了标准 Python 发行版中内置的工具(因此它几乎可以在每个类 Unix 主机上使用;Docker 将是一个额外的安装)并且不需要管理员级别的权限。由于这通常使用主机文件系统,因此您无需四处复制文件、手动映射目录、担心架构错误的本机库等。
VENV := venv
# Create the virtual environment
$(VENV)/bin/python3:
python3 -m venv "$(VENV)"
# Any application stub installed by a package
$(VENV)/bin/pytest: requirements.txt $(VENV)/bin/python3
"$(VENV)/bin/pip" install -r "$<"
# Run the tests
.PHONY: test
test: $(VENV)/bin/pytest
"$(VENV)/bin/python3" ./py_code/run_tests.py
如果你需要构建一个 Docker 镜像,它通常应该是自包含的。不要将代码绑定挂载或docker cp
到图像中; COPY
它在,所以它可以是 docker run
而无需单独的源代码副本。然后,您可以docker run
替代命令,而无需docker exec
调试工具。
REGISTRY := docker.io
IMAGE := me/regex-locator
TAG := latest
DOCKER_IMAGE := $(REGISTRY)/$(IMAGE):$(TAG)
.PHONY: docker-build docker-push docker-run docker-test
docker-build: .docker-build
.docker-build: Dockerfile requirements.txt app/main.py ...
docker build -t "$(DOCKER_IMAGE)" .
touch "$@"
docker-push: docker-build
docker push "$(DOCKER_IMAGE)"
docker-run: docker-build
docker run --rm -p 8000:8000 "$(DOCKER_IMAGE)"
docker-test: docker-build
docker run --rm "$(DOCKER_IMAGE)" ./proj/run_tests.py
这要求您确保您的图像实际上是自包含的——它不应该是一个最终可以运行某些东西的空壳。
FROM python:3.7.1
WORKDIR /regex_locator
COPY ./py_code/req.txt . # no particular need for a subdirectory
RUN pip install -r req.txt
COPY ./py_code . # make sure to copy the rest of the application too
CMD ./main.py # and set a useful command for the container to run
您的单元测试不应具有复杂的依赖项。 (使用内存数据库,如 SQLite 或模拟其他依赖项:80% 功能性和 100% 易于运行的测试比 100% 功能性但很难运行的测试要好得多。)它不应该有什么不同无论它们是在容器中还是在虚拟环境中运行。在这种情况下,您可以在主机上运行单元测试,如果它们通过,则构建并发布您的映像。
make test # in a virtual environment
make docker-push # building the image along the way