【发布时间】:2021-12-30 10:51:47
【问题描述】:
我是 Docker 新手。我在 Docker 中包含的 Flask 应用程序中上传文件并访问它时遇到问题。
假设我有一个采用这种结构的项目:
/home
| /myProjects
| /myDockers
| | /myApp
| | | /controller
| | | ...
| | | wsgi.py
| | | .gitlab-ci.yml
| | | DockerFile
| | | gunicorn.sh
| /uploads
我的 Flask 应用程序位于 /MyApp 中,而我想将文件上传到 /uploads。该应用程序使用以下配置部署在 Docker 上:
.gitlab-ci.yml:
stages:
- build
- deploy
build-image:
stage: build
only:
refs:
- dev
script:
- cd /home/myProjects/myDocker/myApp/
- git checkout dev
- git pull origin dev
- docker container rm -f myApp
- docker image rm -f myApp
- docker build -t myApp -f 20021_DockerfileLmsGeneralRepositoryService .
deploy-container:
stage: deploy
only:
refs:
- dev
script:
- docker run -d --network host -e DATABASE_URL=$DATABASE_URL -e REDIS_HOST=$REDIS_HOST --name myApp myApp
DockerFile:
FROM python:3.8.7-slim-buster AS compile-image
RUN apt-get update && apt-get install -y --no-install-recommends build-essential gcc libpq-dev && apt-get install -y apt-utils
COPY ./requirements.txt .
RUN pip install --upgrade --user -r requirements.txt
RUN pip install injector
COPY . /code
FROM python:3.8.7-slim-buster AS build-image
COPY --from=compile-image /code/ /code
COPY --from=compile-image /root/.local /root/.local
# Make sure scripts in .local are usable:
ENV PATH=/root/.local/bin:$PATH
WORKDIR /code
RUN chmod a+x gunicorn.sh
ENTRYPOINT ["sh","./gunicorn.sh"]
gunicorn.sh:
#!/bin/sh
gunicorn wsgi:application -w 2 --threads 2 --preload -b 0.0.0.0:20021
我已经在我的 Flask 应用程序中创建了一个 API 来上传文件并在本地 (Windows) PC 上成功,但是当我将它部署到开发服务器时,文件夹的结构与我的预期不同。当我使用脚本检查项目结构时,它返回:
"/code/controller"
这和服务器中项目的结构不同,所以我问了我的前辈,他说我应该学习Docker中的Volume,因为项目包含在Docker容器中,但我从来没有使用过Docker。
我也已经尝试将 .gitlab-ci.yml 中的脚本更改为这个(我从这个question 尝试过这个),是的,它不起作用:
- docker run -d --network host -e DATABASE_URL=$DATABASE_URL -e REDIS_HOST=$REDIS_HOST --name myApp -v /home/myProjects/:/root/.local/code myApp
【问题讨论】:
-
您不需要
-v选项来覆盖应用程序代码,也不需要--network host选项来禁用Docker 网络。您的 Dockerfile 中的目录似乎与您最初的描述不匹配,这也有点令人困惑。您究竟在运行什么命令来“检查项目结构”?应用程序是否运行?如果您将文件上传到其中,它们会在哪里结束? -
嗯,不同文件系统结构的原因在于您的 Dockerfile 内部:您复制当前目录的所有内容(我猜应该是目录
myApp,因为那是您的 Dockerfile 所在的位置)进入您的 docker 映像/容器的目录code(如果尚不存在,则会创建它)。结果是/code/controller。顺便说一句,我不确定你为什么要在这里使用音量。 -
@DavidMaze 就是这样。该应用程序确实运行,但是当我上传文件时,我无法跟踪它。我不是在这里制作 Docker 脚本的人,我只是要求创建一个 API 来上传和下载文件。项目文件夹结构与我之前描述的完全一样,但是由于项目运行在 Docker 容器上,当我检查我制作的 Controller API 的结构文件夹时,它返回为
/code/controller,这与我描述的文件夹结构不同之前。 -
@Ibnu 卷基本上只是位于主机系统上的文件或目录,您在启动之前将其放入容器中。这样,您将拥有应用程序的开发映像,您可以在其中始终将应用程序文件的当前状态挂载到容器中,而不是拥有应用程序的固定版本的映像,其中包含应用程序的相应文件图像已经。我只是在这里没有看到很大的优势,因为据我所知,您无法在不停止容器的情况下更改音量,因此在更新应用程序文件时必须始终重新启动它。
-
@Ibnu 我没有使用 gitlab CI 的经验,但是如果您可以访问 gitlab CI 服务器,您可以创建一个目录,其中包含您想要“上传”开箱即用的所有文件。然后,在
.gitlab-ci.yaml中,将此目录的一个卷添加到您的 docker 部署中(在容器内的/uploads中)。现在容器始终包含这些文件,因此从现在开始,这些文件在每个部署中都可用。当然,您可以随时添加更多文件。
标签: docker flask docker-compose flask-restful