我正在尝试构建一个运行 Python 脚本的 docker 容器。我希望在构建映像时从 git 克隆代码。我使用 this 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
错误。