Docker执行在容器内找不到文件

时间:2021-03-20 15:19:44

标签: python docker makefile dockerfile containers

我已经设置了一个容器来运行一些 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"]

提前致谢!

1 个答案:

答案 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