7

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?

  • I think you could try to debug those statements by executing them one by one and see if there is an issue. – profesor79 Aug 12 '19 at 9:44
  • @profesor79 It seems like in Docker I can not create file (folder, make chown) in /var/www/app, because it's volume. – Log Aug 12 '19 at 10:00
5

I found the reason of the problem. In Docker "anything after the VOLUME instruction in a Dockerfile will not be able to make changes to that volume". I define volume "./app:/var/www/app", and after that manipulate with it, so it's not work.

| improve this answer | |
4

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.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.