我面临以下问题,如下所示:来自dockerfile:
FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
RUN touch test.txt
CMD while true; do sleep 1000; done
在docker上运行 project 容器并通过
登录到它docker exec -it project /bin/bash
我们会说' /var/www/html/test.txt'不存在。
这是一个更大的问题,特别是如果我们不是创建一个文件想要例如在php laravel项目中使用composer:
WORKDIR /var/www/html
COPY ./composer.json .
COPY ./composer.lock .
RUN composer install --no-scripts --no-autoloader
然后我们遗憾地发现供应商 -s目录不存在...
答案 0 :(得分:1)
我做了研究,发现问题的原因是底部图像 richarvey / nginx-php-fpm 的dockerfile有指令:
VOLUME /var/www/html
'阻止'在RUN语句中访问子容器内的卷。此问题与此topic on 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项目,它将查找如下实例:
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 &&\
...