在dockerfile中,在RUN语句中创build或复制文件或目录后,它不存在

我面临下面的dockerfile下面的问题ilustrated:

FROM richarvey/nginx-php-fpm WORKDIR /var/www/html RUN touch test.txt CMD while true; do sleep 1000; done 

在Docker上面运行作为项目容器并通过login

 docker exec -it project /bin/bash 

我们将si'/var/www/html/test.txt'不存在。

这是更大的问题,尤其是如果我们而不是创build一个文件想要例如在PHP laravel项目中使用composer php:

 WORKDIR /var/www/html COPY ./composer.json . COPY ./composer.lock . RUN composer install --no-scripts --no-autoloader 

然后,我们不幸地发现, 供应商的目录不存在…

我做了研究,发现问题的原因是底层图像richarvey / nginx-php-fpm的dockerfile有指令:

 VOLUME /var/www/html 

在RUN语句中“阻止”子容器内容的访问。 这个问题与github上的这个话题有关

那么如果我们的基本映像使用VOLUME语句怎么办?

我们可以使用下面的解决方法(通过在CMD语句中使用临时目录和mv命令):

 FROM richarvey/nginx-php-fpm WORKDIR /tmp/project RUN touch test.txt WORKDIR /var/www/html CMD mv /tmp/project/* /var/www/html/ &&\ while true; do sleep 1000; done 

所以对于使用composer php的PHP项目,它会寻找像这样的例子:

 FROM richarvey/nginx-php-fpm WORKDIR /tmp/project # cache vendors lib in separate docker layer COPY ./composer.json . COPY ./composer.lock . RUN composer install --no-scripts --no-autoloader # process project code ADD . . RUN composer dump-autoload --optimize &&\ composer run-script post-install-cmd &&\ php artisan key:generate &&\ ... WORKDIR /var/www/html # we use mv twice to move hidden files CMD mv /tmp/ocenomat/* /var/www/html/ &&\ mv /tmp/ocenomat/.* /var/www/html/ ; fi &&\ ...