I am having a simple python script to fetch data from a table in InfluxDB installed in the local system. The deviceStatus.py script is as shown
import time
import sys
import influxdb
from influxdb import InfluxDBClient
client = InfluxDBClient(host='localhost', port=8086)
client.switch_database('deviceConfiguration')
results = client.query('SELECT (*) FROM "autogen"."FactoryConfig"')
points = results.get_points()
for point in points:
print(point['Connection'])
This script runs without any error and prints the IP Address (Connection) from the table FactoryConfig.
Now I want to create a docker image out of it. I wrote a Dockerfile that looks like this
FROM python:3.10.0b2-buster
WORKDIR /usr/src/app
COPY deviceStatus.py .
RUN pip install influxdb
CMD ["python", "./deviceStatus.py"]
This file compiles and creates a docker image named devicestatus. Now when I try to run the image with sudo docker run devicestatus
it shows me an error on line 8 and complains that it cannot establish a new connection: [Errno 111] Connection refused
File "/usr/src/app/./deviceStatus.py", line 8, in <module>
results= client.query('SELECT (*) FROM "autogen"."FactoryConfig"')
I suppose it’s something to do with the port. I am not able to understand how can I expose the port if this is the problem. I need help regarding this issue.
The query in your code example pretty much looks like a InfluxQL query, which is the old query langage for InfluxDB up to version 1.8.x. Within your Dockerfile, you install the latest InfluxDB version, which is a 2.0+ version that requires Flux queries instead.
If you update your local InfluxDB instance (pip update influxdb), you should experience the same problem. Either make sure to install an older version of InfluxDB within your Dockerfile, or preferably migrate your code to the latest InfluxDB version.
In the Dockerfile, I install the InfluxDB python library. Is there a separate library for 1.8 as well? This python script with the same library works fine when run on the bare Linux OS. The problem arises only when I dockerize it.
I just happen to know the situation with the recent influxdb version change and the incompatibility with the query language they require.
From my perspective this apears to be rather a problem of using consitent versions of the server component and the matching client sdk, than a containerization problem.
So your solution is to use the host instance of influxdb, instead of using the instance running in the container?
To put it in other words: you just care to containerize your self created influxdb client, but want the actual influxdb server to be run outside your container. At least this is what you did and describe as solution.
I am having the InfluxDB running in another container. This was just an added feature that I wanted to include without disturbing the running InfluxDB container.
Also, including InfluxDB in this container was never the plan!
Ah okay. Now the hole situation makes more sense to me
I can see that my previous reponses must have been very misleading from your perpective. Sorry for that!
My assumption was that RUN pip install influxdb installs the server and your python code is the client. Though, it didn’t appear to me that pip install fluxdb would just install the sdk.
ya, no worries.
So pip install influxdb is the python command to install the python influxdb client library.
In the context of image creation using Dockerfile, I have a new issue.
You can see that I have devicestatus:version1 which I create using Dockerfile and python:3.6.13 is the dependency. But the Dockerfile also generates 3 : images. What are these and why are they generated? I don’t want these images!
Those appear to be intermediate images, caused each by an instruction in your Dockerfile. Use docker build --force-rm ... to remove intermediate images regardless if the build succeeds or fails. If you just want to remove intermediate images from succeesful builds use --rm instead of --force-rm.
Note: if you build an image:tag again, the previous image:tag gets “untagged” und becomes a <none> tag.