gotchadockerMinor
Why does chown not work in RUN command in Docker?
Viewed 0 times
whydockerchownworkdoescommandnotrun
Problem
I have the following docker-compose file:
Dockerfile-app:
My last command RUN has no effect: chown does not set the nginx files owner. The folder "uploads" also is not created.
When I run
However, when I run the workload in the "common" way using
Why does my last RUN command not work?
version: '2'
networks:
default:
driver: bridge
services:
yii2-app:
build:
context: .
dockerfile: ./Dockerfile-app
ports:
- "80:80"
networks:
- default
depends_on:
- yii2-db
volumes:
- "./app:/var/www/app"
- "./nginx:/etc/nginx/sites-available"
...Dockerfile-app:
FROM richarvey/nginx-php-fpm
ADD app /var/www/app
RUN rm -Rf /etc/nginx/sites-enabled/*
ADD nginx/site.conf /etc/nginx/sites-available/site.conf
RUN ln -s /etc/nginx/sites-available/site.conf /etc/nginx/sites-enabled/site.conf
RUN cd /var/www/app && \
composer install
RUN cd /var/www/app && chmod +x yii && \
cd web && mkdir -p uploads && \
cd /var/www && chown nginx:nginx -R app/My last command RUN has no effect: chown does not set the nginx files owner. The folder "uploads" also is not created.
When I run
docker-compose build --no-cache that step is passed:Step 7/7 : RUN cd /var/www/app && chmod +x yii && cd web && mkdir -p uploads && cd /var/www && chown nginx:nginx -R app/
---> Running in 26a918bece47
Removing intermediate container 26a918bece47
---> 00db026a461c
Successfully built 00db026a461c
Successfully tagged passport-app_yii2-app:latestHowever, when I run the workload in the "common" way using
docker-compose up -d the change is not applied.Why does my last RUN command not work?
Solution
Your mkdir and chown commands are RUN when building the image, whereas you then mount
If you want to chown the contents of the volume after it is mounted, you should place those instructions on a script that is called as the CMD.
/var/www/app from a VOLUME, so you are replacing the created and chowned folder with the contents of ./app on the outside (and thus it's as if the chown didn't work).If you want to chown the contents of the volume after it is mounted, you should place those instructions on a script that is called as the CMD.
Context
StackExchange DevOps Q#8872, answer score: 6
Revisions (0)
No revisions yet.