Eu tenho o seguinte docker-compose:
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: mysecretpass
restart: always
Posso fazer backup de meus bancos de dados usando este comando:
cd /opt/docker_data/ && /usr/local/bin/docker-compose exec db sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /opt/backup.sql
Isso funciona bem.
Eu adicionei a mesma linha de código ao meu crontable, mas então recebo o seguinte erro:
Traceback (most recent call last):
File "bin/docker-compose", line 6, in <module>
File "compose/cli/main.py", line 71, in main
File "compose/cli/main.py", line 124, in perform_command
File "compose/cli/main.py", line 467, in exec_command
File "site-packages/dockerpty/pty.py", line 338, in start
File "site-packages/dockerpty/io.py", line 32, in set_blocking
ValueError: file descriptor cannot be a negative integer (-1)
Failed to execute script docker-compose
Qual é o meu erro?
Obrigado!
Seu script está falhando porque cron
não aloca um TTY, que docker-compose exec
espera por padrão. Adicionar a sinalização -T
ao seu comando deve remediar isso:
cd /opt/docker_data/ && /usr/local/bin/docker-compose exec -T db sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /opt/backup.sql
Obrigado, isso consertou! =)
Ele corrige com certeza, mas eu diria que o compose poderia lidar com esse erro um pouco melhor, terminando em uma exceção com "ValueError: o descritor do arquivo não pode ser um número inteiro negativo (-1)" não é exatamente descritivo, eu teria capturado a exceção e imprimir um erro mais significativo.
Comentários muito úteis
Seu script está falhando porque
cron
não aloca um TTY, quedocker-compose exec
espera por padrão. Adicionar a sinalização-T
ao seu comando deve remediar isso:cd /opt/docker_data/ && /usr/local/bin/docker-compose exec -T db sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /opt/backup.sql