Heroku build docker image with --no-cache option - python

I'm trying to update a Docker image on my Heroku app.
I just used the following commands from this documentation article: https://devcenter.heroku.com/articles/container-registry-and-runtime
heroku login
heroku container:login
heroku container:push web
heroku container:release web
heroku open
This set of commands worked perfectly the first time, except that I got an error about not being able to map to the $PORT variable I figured out how to fix the problem (I'm using Flask), so I updated my api.py (I named it api.py instead of app.py), and now I want to push the updates to the Heroku app. But running through those commands, it seems to use the cache (I've had this problem on my local machine before; I have to use the --no-cache option when I buid). I don't really know when it's being built on Heroku.
Anyways, at the end of the release command, it says: The process type web was not updated, because it is already running the specified docker image.
How do I get it to update?

Just for the people out there looking at this, it turned out it was a simple mistake in my Dockerfile.
Basically, I was using git clone to get my app files. Because of this, I had no ADD commands anywhere, so all the results were being cached by docker.
All I had to do was run ADD instead of git clone to import my project files, and now everything runs perfectly well :)

Related

How can I deploy a Flask app containing a Kik bot to Heroku? (Python)

Silly newb question, it seems I can't use git to install content I need in the Heroku console, but my app/bot is dependent on content I normally use that for. I know very little about how git and pip work, or the right terminology to ask a question like this, so bare with me!
I have a bot made with Tomer8007's Kik Bot API that I've embedded in Flask and want to deploy to Heroku. I've deployed Flask sites there before, they work like a charm, but because I import everything to Heroku via git using the Heroku CLI I can't import this one which is already using git.
I normally use these two commands to fetch and install the dependencies I need for that project:
git clone -b new https://github.com/tomer8007/kik-bot-api-unofficial
pip install ./kik-bot-api-unofficial
I tried manually downloading and installing the API without git, but then it throws this error when I tried to run it: "TypeError: Couldn't build proto file into descriptor pool: duplicate file name (google/protobuf/descriptor.proto)", wheras it works perfectly fine when I use the two above commands instead. (This is locally btw).
I also made an attempt to import to heroku before using those commands and instead using them in the heroku console, but it throws a bunch of errors when I try. I also can't import it after using those commands locally, because I already used git. (I'm not sure how that works though, that's why I'm here.)
Everything in procfile.txt, requirements.txt, runtime.txt, etc is fine, the only issue is getting the API for the Kik bot. I've no idea what's going haywire when I attempt to manually download it instead of using git clone, or what alternative options I have. Any pointers?
Apparently, the duplicate file name (google/protobuf/descriptor.proto) error was caused by a breaking change in the protobuf package in versions greater than 4.
This is now fixed, and should also work on Python 3.9+.

Heroku "Couldn't find that process type"

Been trying to deploy my python selenium code to Heroku but I keep running into this issue:
--
Terminal command:
heroku ps:scale bot=1
Output:
» Warning: heroku update available from 7.53.0 to 7.59.2.
Scaling dynos... !
! Couldn't find that process type (bot).
Procfile:
bot: python sfkafskafne.py
(Pycharm)
I'm deploying attempting to deploy to Heroku using the PyCharm terminal with the command above
I'm deploying attempting to deploy to Heroku using the PyCharm terminal with the command above
None of the commands in your post deploy your code. heroku ps:scale scales dynos for code that has already been deployed.
Before you scale your dynos, you need to get your code onto Heroku by deploying it. You can do so via git push, GitHub integration, or Docker.
The first two options require that your code be committed to a Git repository. That's a good idea anyway, even if you choose to use Docker deployment.
For the first option, something like this should get you going:
Change to the project directory with cd INSTTTAAAAA
Create a Git repository with git init
Commit your code with git add . followed by git commit -m "Initial commit"
Add a remote with heroku git:remote
Push your code with git push heroku main
Beyond this, I suggest you read the documentation I linke to above. There's lots more to learn that's beyond the scope of a SO question.
You will also want to push your code to GitHub or similar as well. Heroku is not meant to be your primary source code repository.
Side note: I'm not sure if INSTTTAAAA and sfkafskafne mean something in a language that you speak, but if these are effectively random I strongly urge you to rename them. Using good, clear names is very important.

Flask Docker Container Issues

I have a few questions that I am hoping someone can answer here. I realize I have knowledge gap and I am hoping someone here can fill it or at least point me towards the right direction.
I had built a Flask API that I could run inside a Docker Container on Ubuntu OS. To create a Swagger API Documentation, I added to my Flask application:
from flask_swagger_ui import get_swaggerui_blueprint
Rather than moving forward, I stopped the Docker and ran it again and as expected, It resulted in "502 Gateway error". Upon Checking Docker logs here is what I noticed:
ModuleNotFoundError: No module named 'flask_swagger_ui'
I understood this problem as I needed to add this dependency inside my docker. I added the following code to my
"requirements.txt" file: flask_swagger_ui==3.36.0.
However this did not change anything and I still received the same error. I tried adding the module directly into the Dockerfile I created through this code but that did not work either:
RUN pip install flask_swagger_ui
Doing one or both of these things results in 502 Gateway error. I have tried to add several other modules to my application Like Pandas and Sklearn but they result in the same error. I can NOT make any changes to my application without getting Bad Gateway.
To figure out what is wrong, I removed all the changes I had made and got it back to where the only dependency is Flask 2.0.1 in my "requiements.txt". After testing that the Docker is running fine, In a state of confusion, I removed "start.sh", "Dockerfile" and "requirements.txt" and put them in trash bin and restarted Docker.
To my bewilderment, The Docker was working fine! with all the files mentioned above in the trash bin! Since at this point now I was completely lost, I added all the dependencies back again to see if it works this time and got stuck with the same 502 Error and the Logs showed the same issue.
My question then is:
How do I add a dependency to my application?
How on Earth is my Docker container still running after 3 required files in trash bin? I stopped and restarted Docker again, As far as I know, It should not have worked.
Removing "Flask 2.0.1" from the requirements.txt file while it was in my directory and restarting my docker did not affect my Docker application at all and it was running fine. What is happening?
Here is my Dockerfile:
FROM tiangolo/uwsgi-nginx-flask:python3.8-alpine3.7
RUN apk --update add bash nano
RUN pip install pandas flask_swagger_ui
ENV STATIC_URL /static
ENV STATIC_PATH /home/faraz/python_docker/TestApp/app/static
COPY ./requirements.txt /home/faraz/python_docker/TestApp/requirements.txt
RUN pip install -r requirements.txt
and here is my requirements.txt:
Flask==2.0.1
flask_swagger_ui==3.36.0
pandas==1.2.4
Finally, my "start.sh":
#!/bin/bash
app="docker.test"
docker build -t ${app} .
docker run -d -p 56733:80 \
--name=${app} \
-v $PWD:/app ${app}
I had posted another question when I was building my API and the link below will take you to it:Method Not Allowed The method is not allowed for the requested URL. 405 Error
As per suggested by one of the comments: Here is the Github Repository:
https://github.com/frazali32/Docker-Flask-API
I found the answer to my issue. As I had suspected, It was nothing but Knowledge gap. The concept is explained brilliantly in the forum below:
Rebuild Docker container on file changes
Basically,Deleting or changing something locally does nothing to the container unless you are mounting it as a volume or you do not rebuild. In my case, I deleted the Docker Image created in my first attempt, Built another Image and restarted the Docker. It works now!

How to set-up Docker container and Dockerfile with php-apache and python?

I am attempting to set-up a docker container with php-apache and python. This is primarily for a php web application. For part of the functionality I wrote a python script that is utilizing a python library which fulfills functionality that I couldn't find with php. Otherwise I'd have just tried to stick to php for everything. I run the python script with php's shell_exec command. Everything works in my local development environment; however, when I attempt to push to production problems arise. Anyways, I have been trying for hours (tons of research on the topic) and I cannot figure out how to get Python installed on the same Docker container as php-apache. Here is an example of a Dockerfile I've been using:
FROM python:3.7
RUN apt-get update
RUN apt-get install python3.7
COPY requirements.txt ./
RUN pip3 install -r requirements.txt
FROM php:7.4.13-apache
RUN docker-php-ext-install mysqli pdo pdo_mysql
With this set-up I get "sh: 1: python: not found".
If I remove the last two lines (php-apache) the container keeps restarting continuously (though python is installed in this case). I've tried many other examples of dockerfiles for python and combined with php-apache none have worked.
I ended up going with the suggestion from #DavidMaze and setting up two separate containers, one for php:apache, and one for python. For the python container I built a simple flask application with endpoints that, when a GET request is made, run a specific python function. I used PHP curl to communicate with this flask api from the php:apache container.

Deploying Flask application to Heroku gives an ImportError from psycopg2

Recently I'm learning Flask by the book "Flask Web Development". When I completed the code and deployed it to Heroku, the following error happened:
ImportError: /app/.heroku/python/lib/python3.6/
sitepackages/psycopg2/.libs/libresolv-2-c4c53def.5.so:
symbol __res_maybe_init version GLIBC_PRIVATE not defined
in file libc.so.6 with link time reference
However, this works fine locally. I have searched relevant questions about psycopg2, and I have adjusted the version of psycopg2 but the same error still happens. Please, how can I solve the problem?
I got the same problem. I solved it by forcing heroku to clean up the python virtual environment, and reinstall the requirements.txt file using psycopg2>=2.7,<2.8 --no-binary psycopg2. I must admit it felt a little like magic, but for what its worth here are the steps I took:
Using Git Bash for Windows, I logged in to heroku with heroku login.
Next, I navigated to the root folder of the git/project folder I was working on.
There I made sure that my requirements.txt was updated by running venv/Scripts/pip freeze > requirements.txt. You will probably have to find your own python/virtual environment path.
Next I changed the line/entry for psycopg2 to psycopg2>=2.7,<2.8 --no-binary psycopg2.
Then saved all the content of the requirements.txt file to my desktop, making sure the one in my project folder was empty. Not sure if this step was necessary. But that's what I did, so I'm just gonna mention it here.
Now in the Git Bash terminal I ran heroku apps:info -a blogglistene to find the version of the my heroku stack which for me was heroku-18.
Next I look online for the supported versions of python for heroku-18. It said the default was python-3.6.6 (which I then assumed is the one I was running), and some others.
I then picked python-2.7.15 arbitrarily from the list, and added that text to a runtime.txt file which I placed in the root of my project folder.
Next I committed and pushed this to my heroko git repo, and it was deployed. This will temporarily break the build. From what I understand, the magic behind this is that heroku now fully destroys the python interpreted and environment, so no lingering cached files or anything. Clean slate.
Then I reverted the content of runtime.txt to the default of python-3.6.6 and added back the content of the requirements.txt file, making sure the changes I made are there.
Finally, I committed and pushed this, and my application was back up and running.
I had the exact same problem when I was following "Flask Web Development". I spent a day plus trying to solve it and eventually succeeded. It's not as complicated as André C. Andersen's method.
Make sure you are on master branch. Not other branches.
The book is second edition of Flask Web Development by Miguel Grinberg. Chapter 17. Deployment. When you work all the way till Deploying with git push, after git push heroku master to upload the application to the heroku remote. The application is now deployed and running, but it is not going to work correctly because the deploy command that initializes the database tables has not been executed yet. You need to use
heroku run flask deploy
to create database on heroku. That's where the problem appears.
This is because at this point your git repo HEAD is at 17c. It's not the master branch yet. If you commit any change now, it won't change heroku environment. Meaning when you do
git branch
You will see:
(HEAD detached from 17c)
master
But this is not what you want. Not head attached to 17c. You want to see only master, which is achieved with
git checkout master
Then git branch will show only master branch. Therefore you can make adjustments on the project and heroku will update. Doing this because you will eventually git push to master branch. I think you can git push to other branches in order for heroku to work, but I don't know how to do that.
Change psycopg2==2.7.3 to the newest version, e.g. psycopg2==2.8.4. Another workaround is to change it to psycopg2-binary==2.8.3.
psycopg2 2.7.3 will give you GLIBC_PRIVATE error. (You can check it by running heroku run bash, then starting python and importing psycopg2. If heroku dependency is 2.7.3, then you will see the same error.) The official website notes that version 2.7.3.1 drops libresolv which causes the issue, therefore using this version or later should do the trick.
Now, change your requirements/heroku.txt (heroku environment dependency) line psycopg2==2.7.3 to psycopg2--2.8.4 or psycopg2-binary==2.8.3. (For some reason binary version of psycopg2 will work without issue. Don't know why, but I saw A LOT of discussion on stackover.) Then,
git add .
git commit -m "notes"
As usual.
git push heroku master
Push to heroku master branch. If you do not do step 1, then git will show Everything up-to-date. Therefore, it won't make changes because you are committing not to master. Now, you can see git is downloading the appropriate package.
You can double check if the packages are correct by opening heroku bash then pip list. You will see psycopg2 (and psycopg2-binary if you chose the workaround). Now, when you start Python, you can import psycopg2 with no problem.
Finally. heroku run flask deploy. Voila!
I was stuck on step 1, since whatever change I made with the project, heroku just didn't update.

Categories

Resources