HiveBrain v1.2.0
Get Started
← Back to all entries
gotchadockerMinor

Why does chown not work in RUN command in Docker?

Submitted by: @import:stackexchange-devops··
0
Viewed 0 times
whydockerchownworkdoescommandnotrun

Problem

I have the following docker-compose file:

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:latest


However, 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 /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.