我是 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"
Which is different from the structure of the project in the server, so I ask my senior and he said I should learn about Volume in Docker since the project is contained inside Docker container, but I never used Docker in the first place.
I also already tried to change the script in .gitlab-ci.yml into this (I tried this from this question) and yeah it doesn't work:
- docker run -d --network host -e DATABASE_URL=$DATABASE_URL -e REDIS_HOST=$REDIS_HOST --name myApp -v /home/myProjects/:/root/.local/code myApp
uj5u.com熱心網友回復:
在我們的談話之后,我可以看到另一個更簡單的解決方案。我的其他答案的一部分仍在適用。
從您的作業檔案夾結構來看,您的應用程式似乎嘗試寫入../../uploads檔案夾,目錄結構中的 2 個級別。因此我們可以在容器中創建一個檔案夾結構來適應這個。
在Dockerfile做這些改變:
- 編輯
COPY --from=compile-image /code/ /code為COPY --from=compile-image /code/ /code/app - 編輯
WORKDIR /code為WORKDIR /code/app RUN mkdir /uploads在之后FROM .. AS build-image和之前的任何地方添加ENTRYPOINT
我們將應用程式 2 級復制到容器深處,并將上傳檔案夾添加到根目錄中。
現在運行將您的運行命令更改為:
docker run -d --network host -e DATABASE_URL=$DATABASE_URL -e REDIS_HOST=$REDIS_HOST --name myApp -v /home/myProjects/uploads:/uploads myApp
我們將主機中的上傳檔案夾系結安裝到容器中的上傳檔案夾中。你可以將系結作為-v path_to_your_uploads_folder_in_host:/uploads
uj5u.com熱心網友回復:
您cd /home/myProjects/myDocker/myApp/在 CI 檔案和COPY . /codedocker 構建檔案中使用。
這意味著“無論您在主機/home/myProjects/myDocker/myApp/檔案夾中看到什么,都將它們全部復制到/code容器的檔案夾中”。因此你...myApp/*變成/code/*
但你的痛苦不僅如此。從應用程式的角度來看,您正在將上傳的檔案寫入其中,../../uploads但您的容器中沒有這樣的檔案夾。另請注意,您的主機中有 2 個父級別,并且您的應用程式正在尋找這樣的路徑,并且無論如何都不會在容器內找到,因為您的專案距根級別僅 1 級深。
在后一種情況下,更改您的代碼以從環境 ( os.environ?) 中讀取上傳檔案夾路徑,將默認值設定../../uploads為您的開發,在您的容器內創建一個檔案夾,例如/uploads,將其路徑添加到您的 docker 檔案中,ENV然后映射主機和容器上傳帶有卷命令的檔案夾路徑,可能-v home/myProjects/uploads:/uploads
編輯:
我寫了一個簡單的應用程式來完成上面的最后一段。請訪問此地址:https : //github.com/yilmazdurmaz/basicbindmount
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/403772.html
標籤:
上一篇:sqlalchemy.exc.ProgrammingErrorFlaskSQLAlchemy無法從我的表中讀取資料
