Corrige permissão do volume de clientes/ via entrypoint, não build
RUN chown no Dockerfile só atinge a imagem: o bind mount de clientes/ substitui o diretório (dono incluído) ao subir o container, apagando qualquer chown feito em build. entrypoint.sh roda como root no início do container, ajusta o dono do volume recém-montado e derruba privilégio para o usuário sd (via gosu) antes do gunicorn. .gitattributes fixa LF em *.sh: autocrlf do Git no Windows senão reescreveria o script para CRLF, quebrando o shebang dentro do container. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+18
-4
@@ -23,6 +23,12 @@ ENV PYTHONUNBUFFERED=1 \
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# gosu: o entrypoint precisa iniciar como root (só root faz chown no volume
|
||||
# recém-montado) e depois derrubar privilégio para `sd` antes do gunicorn.
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends gosu \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Dependências em camada própria: mudar código não reinstala pacote.
|
||||
# requirements.txt é o mesmo do venv Windows; o gunicorn fica separado porque
|
||||
# é só do deploy (no Windows ele não instala).
|
||||
@@ -33,13 +39,21 @@ RUN pip install --no-cache-dir -r requirements.txt -r requirements-deploy.txt
|
||||
COPY scripts/ ./scripts/
|
||||
COPY app/ ./app/
|
||||
|
||||
# Usuário sem privilégio. Precisa poder escrever em /app/clientes (o "Salvar
|
||||
# SD.md") e em /app/_derivados — o dono do volume no host tem de bater com
|
||||
# este UID, ou a gravação recusa com permissão negada.
|
||||
# Usuário sem privilégio — quem roda o gunicorn, via entrypoint.sh.
|
||||
RUN mkdir -p /app/clientes /app/_derivados \
|
||||
&& useradd --create-home --uid 10001 sd \
|
||||
&& chown -R sd:sd /app
|
||||
USER sd
|
||||
|
||||
# chmod aqui, e não só no arquivo do host: git em Windows não carrega bit de
|
||||
# execução, então sem isso o entrypoint chega ao Coolify sem permissão de
|
||||
# executar.
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
# Container começa como root DE PROPÓSITO — é o entrypoint.sh que faz o
|
||||
# chown do volume recém-montado e derruba para `sd` antes do gunicorn. Ver
|
||||
# entrypoint.sh.
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
EXPOSE 5000
|
||||
|
||||
|
||||
Reference in New Issue
Block a user