开发者问题收集

Docker:构建后缺少文件

2020-09-04
2543

我正在尝试构建一个运行 Python 脚本的 docker 容器。我希望在构建镜像时从 git 克隆代码。我正在使用 docker 文件作为基础,并在第一行之前添加了以下内容:

FROM debian:buster-slim AS intermediate

RUN apt-get update
RUN apt-get install -y git

ARG SSH_PRIVATE_KEY
RUN mkdir /root/.ssh/
RUN echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa

RUN touch /root/.ssh/known_hosts
RUN ssh-keyscan [git hostname] >> /root/.ssh/known_hosts

RUN git clone git@...../myApp.git

...然后在第一行之后直接添加以下内容:

# Copy only the repo from the intermediate image
COPY --from=intermediate /myApp /myApp

...然后在最后我添加了这个来安装一些依赖项:

RUN set -ex; \
    apt-get update; \
    apt-get install -y gcc g++ unixodbc-dev libpq-dev; \
    \
    pip install pyodbc; \
    pip install paramiko; \
    pip install psycopg2

我将要运行的命令更改为:

CMD ["python3 /myApp/main.py"]

如果在 CMD 之前的 dockerfile 末尾,我添加了命令“RUN ls -l /myApp” 它列出了构建期间我期望的所有文件。但是当我使用“docker run”运行映像时,它给了我以下错误:

docker:守护进程的错误响应:OCI 运行时创建失败:container_linux.go:349:启动容器进程导致“exec:“python3 /myApp/main.py”:stat python3 /myApp/main.py:没有这样的文件或目录”:未知。

我的构建命令是: docker build --file ./Dockerfile --tag my_app --build-arg SSH_PRIVATE_KEY="$(cat sshkey)" 。

然后使用 docker run my_app

可能有一些我误解的 docker 基础知识,但我似乎无法弄清楚它是什么。

2个回答

如果没有命令行或 docker-compose.yml(如果有),这个问题很难回答。一个经常犯的错误是将主机上的卷映射到容器中的非空位置,在这种情况下,您的容器文件会被主机文件夹的内容隐藏。

最后一个 CMD 应该是这样的:

CMD ["python3", "/myApp/main.py"]
Cyril G.
2020-09-04

我也遇到过这种情况 - 我找到了解决方案,但我并不完全理解为什么会发生这种情况。 docker 镜像源代码是从 git 中提取的,由于某种原因, .gitignore 中指定的所有文件和目录均未添加。

为了解决这个问题,我删除了所有与 git 相关的信息(最重要的是 .gitignore ),然后运行了另一次构建。 这次所有文件都已添加,并且没有 FileNotFound 错误。

Daya Frenkiel
2024-05-01