【问题标题】:In dockerfile after create or copy file or directory in RUN statement it not/doesn't exists在 RUN 语句中创建或复制文件或目录后的 dockerfile 中,它不/不存在
【发布时间】:2017-11-26 03:29:06
【问题描述】:

我面临以下 dockerfile 说明的问题:

FROM richarvey/nginx-php-fpm

WORKDIR /var/www/html

RUN touch test.txt

CMD while true; do sleep 1000; done

作为 project 容器在 docker 上运行并通过

登录
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

然后我们很遗憾地发现 vendor-s 目录不存在...

【问题讨论】:

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


    【解决方案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 &&\
        ...
    

    【讨论】:

    • @brunocascio - 谢谢 - 非常有趣的 nginx-php-fpm dockerfile 没有 VOLUME 语句:)
    • 不客气 :) 是的,Dockerfile 上的 VOLUME 实际上是一个非常糟糕的主意。今天的存在只是为了复古兼容性,但严重的是,不建议这样做,因为在每次创建新容器时,都会创建一个新卷,然后存储大量悬空卷。
    • 如果需要跨容器共享数据,可以使用named volumes
    猜你喜欢
    • 2021-05-04
    • 2019-06-23
    • 1970-01-01
    • 2017-02-19
    • 2016-01-04
    • 2015-07-21
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多