我面临以下dockerfile阐明的问题:
FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
RUN touch test.txt
CMD while true; do sleep 1000; done
在上面运行 docker 作为项目容器并通过以下方式登录后
docker exec -it project /bin/bash
我们将 '/var/www/html/test.txt' 不存在。
这是一个更大的问题,特别是如果我们不创建一个文件,例如在php laravel项目中使用作曲家:
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
因此,对于带有作曲家的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 &&
...