Docker:构建后缺少文件
我正在尝试构建一个运行 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 基础知识,但我似乎无法弄清楚它是什么。
如果没有命令行或 docker-compose.yml(如果有),这个问题很难回答。一个经常犯的错误是将主机上的卷映射到容器中的非空位置,在这种情况下,您的容器文件会被主机文件夹的内容隐藏。
最后一个 CMD 应该是这样的:
CMD ["python3", "/myApp/main.py"]
我也遇到过这种情况 - 我找到了解决方案,但我并不完全理解为什么会发生这种情况。
docker 镜像源代码是从 git 中提取的,由于某种原因,
.gitignore
中指定的所有文件和目录均未添加。
为了解决这个问题,我删除了所有与 git 相关的信息(最重要的是
.gitignore
),然后运行了另一次构建。
这次所有文件都已添加,并且没有
FileNotFound
错误。