事实证明,人们通过docker部署到heroku时不只是放弃使用本地磁盘。令人惊讶,我知道。
据我所知,不可能以非root用户身份在部署在heroku上的docker容器内写入磁盘(创建非root用户并通过dockerfile整理目录在我的本地机器上工作正常)。
我正在尝试创建一个简单的api,以提取视频,使用ffmpeg处理它们并存储它们。 FFMPEG需要其输出使用磁盘路径(我尝试使用s3预签名的url,但它们不适用于输出多个动态命名文件的HLS)。
这些容器在本地部署和工作精美...
Heroku以非root用户身份运行docker build指令,但是挂载的卷仍然是root所拥有,并且无法由应用程序中执行命令的用户写入。
创建容器的文件结构后,我不知道如何更改目录权限。通过执行heroku.yml,构建管道在github部署上自动开始,并且那里的权限都不够。
人们在将docker部署到heroku时不只是放弃使用本地磁盘全部
,对吗?这是我的heroku.yml:
] >build: docker: web: ./web/Dockerfile config: LC_ALL: C.UTF-8 LANG: C.UTF-8 run: worker: command: - rq worker --url redis://redistogo:xxxxxx/ my_queue image: web
和明显的dockerfile(请注意,chmod和chown在本地可以正常工作:]:>
FROM ubuntu:18.04 WORKDIR /usr/src/app COPY requirements.txt . RUN pip3 install --no-cache-dir -r requirements.txt COPY . . RUN adduser -q worker # RUN chmod -R 0777 /usr/src/app # fails with insufficient permission # RUN chown -R worker /usr/src/app # fails with insufficient permission USER worker
据我所知,不可能以非root用户身份将其写入部署在heroku上的docker容器内的磁盘(创建非root用户并通过dockerfile整理目录工作正常...
事实证明,人们通过docker部署到heroku时不只是放弃使用本地磁盘。令人惊讶,我知道。
主要是在运行chown时使用正确的用户组设置(以及dockerfile中的顺序)。这是为我工作的dockerfile(我的web和worker进程都使用它,它们也使用相同的图像,这很重要):
这是起作用的dockerfile:
FROM ubuntu:18.04 WORKDIR /usr/src/app ENV LC_ALL C.UTF-8 ENV LANG C.UTF-8 COPY requirements.txt . RUN pip3 install --no-cache-dir -r requirements.txt COPY . . RUN adduser -q web RUN mkdir -p /usr/src/app/tempfiles RUN chown -R web:web /usr/src/app/tempfiles USER web CMD gunicorn --bind 0.0.0.0:$PORT wsgi
原始帖子中的heroku.yml起作用,这是通过docker-compose.yml进行的本地设置:
version: '3' services: web: build: ./web env_file: ./web/.env ports: - "5000:5000" volumes: - ./web:/web worker: build: ./web env_file: ./worker/.workerenv command: rq worker --url redis://redistogo:xxxxxx/ my_queue volumes: - ./web:/web
事实证明,人们通过docker部署到heroku时不只是放弃使用本地磁盘。令人惊讶,我知道。