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

时间:2017-06-22 17:56:36

标签: laravel docker file-io composer-php dockerfile

我面临以下问题,如下所示:来自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目录不存在...

1 个答案:

答案 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 &&\
    ...
相关问题