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



我面临以下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 &&
    ...

相关内容

  • 没有找到相关文章

最新更新