2017-01-26 13 views
0

Я пытаюсь Dockerize PyroCMS и это, как мой Dockerfile выглядит следующим образом:Docker build: есть ли контент с одного слоя на следующем?

FROM reynierpm/docker-centos7-supervisord:latest 
ENV TERM=xterm \ 
    PATH="/root/.composer/vendor/bin:${PATH}" \ 
    COMPOSER_ALLOW_SUPERUSER=1 \ 
    COMPOSER_ALLOW_XDEBUG=1 \ 
    COMPOSER_DISABLE_XDEBUG_WARN=1 \ 
    COMPOSER_HOME="/root/.composer" \ 
    COMPOSER_CACHE_DIR="/root/.composer/cache" 

RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \ 
        https://rpms.remirepo.net/enterprise/remi-release-7.rpm 
RUN yum install -y \ 
     yum-utils \ 
     git \ 
     zip \ 
     unzip \ 
     wget \ 
     nano \ 
     php71-php-fpm \ 
     php71-php-cli \ 
     php71-php-common \ 
     php71-php-gd \ 
     php71-php-intl \ 
     php71-php-json \ 
     php71-php-mbstring \ 
     php71-php-mcrypt \ 
     php71-php-mysqlnd \ 
     php71-php-pdo \ 
     php71-php-pear \ 
     php71-php-xml \ 
     php71-php-pecl-xdebug \ 
     php71-pecl-apcu \ 
     php71-php-pecl-apfd \ 
     php71-php-pecl-memcache \ 
     php71-php-pecl-memcached \ 
     php71-php-pecl-mongodb \ 
     php71-php-pecl-redis \ 
     php71-php-pecl-request \ 
     php71-php-pecl-uploadprogress \ 
     php71-php-pecl-xattr \ 
     php71-php-pecl-zip && \ 
     yum clean all && rm -rf /tmp/yum* 
RUN ln -sfF /opt/remi/php71/enable /etc/profile.d/php71-paths.sh && \ 
    ln -sfF /opt/remi/php71/root/usr/bin/{pear,pecl,phar,php,php-cgi,phpize} /usr/local/bin/. && \ 
    mv -f /etc/opt/remi/php71/php.ini /etc/php.ini && \ 
    ln -sfF /etc/php.ini /etc/opt/remi/php71/php.ini && \ 
    rm -rf /etc/php.d && \ 
    mv /etc/opt/remi/php71/php.d /etc/. && \ 
    ln -sfF /etc/php.d /etc/opt/remi/php71/php.d 

RUN /bin/sh -c "mkdir -p /data/www" && \ 
    /bin/sh -c "mkdir -p /data/php/{tmp,sessions,xdebug,logs,uploads}" && \ 
    rm -rf /data/www/* 
COPY container-files/
WORKDIR /data/www 
RUN sh /usr/local/bin/composer-install.sh 
RUN git clone --branch 3.2 https://github.com/pyrocms/pyrocms.git . 
COPY .env . 
RUN pwd && ls -la 
RUN php artisan install --ready 
RUN chmod +x /config/bootstrap.sh 
EXPOSE 9005 

Это WIP, так что не беспокоить с оптимизацией или так далее, так как я не забочусь об этом в данный момент.

Для построения изображения я бегу docker build -t reynierpm/pyrocms . который идет гладко до тех пор, пока не достигнет этого шага:

RUN php artisan install --ready 

, где терпит неудачу со следующей ошибкой:

Step 14/16 : RUN php artisan install --ready 
---> Running in ffbddd585ef1 
Could not open input file: artisan 
The command '/bin/sh -c php artisan install --ready' returned a non-zero code: 1 

Я не уверен, что я делаю неправильно, но это то, что у меня есть до сих пор:

  • WORKDIR /data/www сохранит все мои работать теперь в /data/www, если я не изменить его на другую директорию, которую я не делаю в любой точке
  • RUN git clone --branch 3.2 https://github.com/pyrocms/pyrocms.git . клонов правильно ветки репозитория, так как делать ls -la только после команды показывает мне следующий вывод:

    drwxr-xr-x 16 root root 4096 Jan 26 16:50 . 
    drwxr-xr-x 3 root root 4096 Jan 26 16:50 .. 
    drwxr-xr-x 8 root root 4096 Jan 26 16:50 .git 
    -rw-r--r-- 1 root root 12 Jan 26 16:50 .gitattributes 
    -rw-r--r-- 1 root root 97 Jan 26 16:50 .gitignore 
    -rw-r--r-- 1 root root 2254 Jan 26 16:50 CONTRIBUTING.md 
    -rwxr-xr-x 1 root root 556 Jan 26 16:50 Gulpfile.js 
    -rw-r--r-- 1 root root 1088 Jan 26 16:50 LICENSE.md 
    -rw-r--r-- 1 root root 236 Jan 26 16:50 README.md 
    drwxr-xr-x 2 root root 4096 Jan 26 16:50 addons 
    drwxr-xr-x 3 root root 4096 Jan 26 16:50 app 
    -rwxr-xr-x 1 root root 1646 Jan 26 16:50 artisan 
    drwxr-xr-x 3 root root 4096 Jan 26 16:50 bootstrap 
    -rw-r--r-- 1 root root 1525 Jan 26 16:50 build.xml 
    -rw-r--r-- 1 root root 3708 Jan 26 16:50 composer.json 
    drwxr-xr-x 2 root root 4096 Jan 26 16:50 config 
    drwxr-xr-x 2 root root 4096 Jan 26 16:50 core 
    drwxr-xr-x 5 root root 4096 Jan 26 16:50 database 
    drwxr-xr-x 3 root root 4096 Jan 26 16:50 docs 
    -rwxr-xr-x 1 root root 400 Jan 26 16:50 package.json 
    -rwxr-xr-x 1 root root 1397 Jan 26 16:50 phpunit.xml 
    drwxr-xr-x 5 root root 4096 Jan 26 16:50 public 
    drwxr-xr-x 6 root root 4096 Jan 26 16:50 resources 
    drwxr-xr-x 2 root root 4096 Jan 26 16:50 routes 
    -rwxr-xr-x 1 root root 560 Jan 26 16:50 server.php 
    drwxr-xr-x 8 root root 4096 Jan 26 16:50 storage 
    drwxr-xr-x 2 root root 4096 Jan 26 16:50 tests 
    drwxr-xr-x 3 root root 4096 Jan 26 16:50 tmp 
    
  • COPY .env . скопирует файл .env в /data/www (но если синтаксис не так уже пробовал с COPY .env /data/www/.env)

После выполнения шагов выше, я должен в конечном итоге с содержанием от клона и дополнительно также .dev но это странно, так как я в конечном итоге только это:

total 12 
drwxr-xr-x 2 root root 4096 Jan 26 16:54 . 
drwxr-xr-x 3 root root 4096 Jan 26 16:54 .. 
-rw-rw-r-- 1 root root 337 Jan 26 15:39 .env 

И, конечно, это сделать сборку, чтобы потерпеть неудачу, так как файла artisan больше нет.

Почему? Разве файлы не должны находиться между слоями? Есть идеи?

+0

попытался удалить '.' (точку) в конце' RUN git clone [...] 'line? –

+0

@ WebertS.Lima, если я удалю '.', он будет клонировать в подкаталоге' pyrocms', который я не хочу. – ReynierPM

+0

О, я вижу. Как вы можете видеть, докер выводит каждый идентификатор уровня в форме '---> Запуск в ffbddd585ef1'. Вы можете попробовать 'docker exec -ti XXXX bash', где' XXXX' является идентификатором части RUN git clone [...], а затем запускать эту команду вручную. Посмотрите, что произойдет. –

ответ

3

Я только что нарисовал изображение reynierpm/docker-centos7-supervisord:latest на моей машине, а /data местоположение на этом изображении является томом.

$ docker inspect reynierpm/docker-centos7-supervisord:latest 
... 
     "Volumes": { 
      "/data": {} 
     }, 
... 

Каждый этап сборки выполняется как контейнер. Поскольку /data - это объем, указанный изображением, каждый шаг будет иметь новый, пустой, анонимный том в/data. Когда шаг сборки завершается, изменения в системе копирования на запись фиксируются как следующий уровень. Поскольку любые изменения в /data находятся в томе, а не в файловой системе COW, они не включены в фиксацию.

Чтобы обойти это, убедитесь, что вы добавляете или копируете файлы в то место, которое не является томом в базовом изображении, которое вы используете.