'Copy dockerfile files ADD instruction in superset

I have the following DockerFile

FROM apache/superset:pr-19860
RUN pip install elasticsearch-dbapi
RUN superset superset fab create-admin \
               --username admin \
               --firstname Superset \
               --lastname Admin \
               --email [email protected] \
               --password admin

RUN superset superset db upgrade
RUN superset superset load_examples
RUN superset superset init
ADD https://github.com/domsoltel/superset/blob/436efe104938d0ca555bb99c586f3d2675a69a59/config.py /app/superset/
ADD https://github.com/domsoltel/superset/blob/436efe104938d0ca555bb99c586f3d2675a69a59/viz.py /app//superset/

I have to modify the config.py and viz.py file to make it work the way I want it to. These files already exist in the superset container but I need to modify a few variables

If I do docker cp it works perfectly, from my pc to the container it works perfectly but with the dockerfile I get the following error

PermissionError: [Errno 13] Permission denied: '/app/superset/config.py'

I think it might be a permissions problem, how can I fix it?



Solution 1:[1]

The superset image is set up to run as the user superset which doesn't have full permissions. So before your change anything, you should switch to root and then back to the superset user when you´re done.

You can see an example at the bottom of the page for the image (under 'How to extend this image'): https://hub.docker.com/r/apache/superset

FROM apache/superset:pr-19860
USER root
RUN pip install elasticsearch-dbapi
RUN superset superset fab create-admin \
               --username admin \
               --firstname Superset \
               --lastname Admin \
               --email [email protected] \
               --password admin

RUN superset superset db upgrade
RUN superset superset load_examples
RUN superset superset init
ADD --chown=superset:superset https://raw.githubusercontent.com/domsoltel/superset/436efe104938d0ca555bb99c586f3d2675a69a59/config.py /app/superset/
ADD --chown=superset:superset https://raw.githubusercontent.com/domsoltel/superset/436efe104938d0ca555bb99c586f3d2675a69a59/viz.py /app/superset/
RUN chmod 644 /app/superset/config.py && chmod 644 /app/superset/viz.py
USER superset

I've also changed the URLs of the files to the raw versions. With the URLs you had, you would add HTML versions of the files which isn't going to work.

Solution 2:[2]

Since you're using docker-compose; then use volumes to map those files

you_service:
  image: .....
  ....
  ....
  volumes:
    - /home/config.py:/app/superset/config.py
    - /home/viz.py:/app/superset/viz.py

Note that volumes must be an absolute path to work with mapping files (unlike mapping directories)

Another note: if the file is in-use by the container; then you'll get the permission error anyway!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Shadi Naif