docker: результаты git clone находятся не в локальном томе, аргументы не расширяются - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь поднять PHP-приложение через Docker.Я могу заставить его работать вручную, но я пытаюсь улучшить его (сделать его более удобным для использования в среде CI / CD), следуя рекомендациям (например, образы с одной ответственностью и т. Д.)

TLDR:

  1. Как надежно клонировать git-репо на локальный общий том?
  2. Как перейти из файла .env к извлечению определенного тега git?

Проблемы:

  1. При клонировании git в путь, сопоставленный с локальным томом, в моем локальном пути нет данных / файлов
    • Я нашел статьи, в которых упоминалось, что отображение пустого тома ранее в процессе сборки приведет к тому, что путь будет пустым (но я не думаю, что это применимо непосредственно здесь.)
  2. docker-compose config покажет правильное значение для TAO_CODE_TAG, но оно завершается неудачно (рассматривается как пустое) во время извлечения
    • Я знаю, в зависимости от того, как оно вызывается в файле dockerfile, раскрытие переменных оболочки может не происходить.Тем не менее, я видел рабочие примеры его работы с RUN echo $var?

. /. Env

PHP_VERSION=7.0
MYSQL_VERSION=5.7
APACHE_VERSION=2.4.32
TAO_CODE_TAG=v3.2-rc02
DB_ROOT_PWD=password ;-)

. / Docker-compose.yml

version: "3.2"

services:
  git:
    build:
      context: './git/'
      args:
        TAO_CODE_TAG: ${TAO_CODE_TAG:?err}
    volumes:
      - ./tao-src/:/build
    container_name: git

  composer:
    image: composer/composer:php7  #  Would be nice to use tag from .env for php version
    command: install
    depends_on:
      - git
    volumes:
      - ./tao-src/:/app
    container_name: composer

  php:
    build:
      context: './php/'
      args:
        PHP_VERSION: ${PHP_VERSION:?err}
    depends_on:
      - composer
    networks:
      - backend
    ports:
      - 9000:9000
    volumes:
      - ./tao-src/:/var/www/html/
    container_name: php

  apache:
    build:
      context: './apache/'
      args:
        APACHE_VERSION: ${APACHE_VERSION:?err}
    depends_on:
      - git
      - php
      - mysql
    networks:
      - frontend
      - backend
    ports:
      - 80:80
    volumes:
      - ./tao-src/:/var/www/html/
    container_name: apache

  mysql:
    image: mysql:${MYSQL_VERSION:-latest}
    networks:
      - backend
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PWD:?err}
    container_name: mysql

networks:
  frontend:
  backend:

. / Apache / Dockerfile

ARG APACHE_VERSION=""
FROM httpd:${APACHE_VERSION:+${APACHE_VERSION}-}alpine

# Copy apache vhost file to proxy php requests to php-fpm container
COPY demo.apache.conf /usr/local/apache2/conf/demo.apache.conf
RUN echo "Include /usr/local/apache2/conf/demo.apache.conf" \
    >> /usr/local/apache2/conf/httpd.conf

. / Apache / demo.apache.conf

ServerName localhost

LoadModule rewrite_module /usr/local/apache2/modules/mod_rewrite.so
LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so

<VirtualHost *:80>
    # Proxy .php requests to port 9000 of the php-fpm container
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
    DocumentRoot /var/www/html/
    <Directory /var/www/html/>
        DirectoryIndex index.php
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Send apache logs to stdout and stderr
    CustomLog /proc/self/fd/1 common
    ErrorLog /proc/self/fd/2
</VirtualHost>

. / git / Dockerfile

ARG TAO_CODE_TAG
FROM alpine/git:1.0.4
RUN apk add git \
    && mkdir /build \
    && git clone https://github.com/oat-sa/package-tao /build \
    && cd /build \
    && git checkout tags/v3.2-rc02 # Should use val from .env!
VOLUME ["/build"] # Last in file so as to not "disappear" during build

. / php / Dockerfile

ARG PHP_VERSION=""
FROM php:${PHP_VERSION:+${PHP_VERSION}-}fpm-alpine

# One run/layer as needed/able per recommendation in docs
# https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run
RUN apk update \
    # TAO requires zip support
    && apk add libzip-dev zip \
    && docker-php-ext-configure zip --with-libzip \
    && docker-php-ext-install zip \
    # TAO requires pdo_mysql support
    && docker-php-ext-install pdo_mysql \
    # TAO recommends opcache
    && docker-php-ext-install opcache \
    && docker-php-ext-configure opcache --enable-opcache \
    # Ensure a php.ini is present
    && mv $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini;

PS: В конечном итоге такие вещи, как использование секретного сервера для безопасных учетных данных и т. Д., А также использование автоматического сценария установки с файлом .env, будуттакже реализовано.

1 Ответ

0 голосов
/ 31 октября 2018

Теперь я могу перейти на страницу веб-установки.Итак, для всех заинтересованных ...

# 1 - проблема источника / клона

Я понял, что все, что мне нужно, это compose.json и индекс .файлы php , которые я могу получить с помощью jsdeliver в ADD инструкциях dockerfile , за которыми следует рекурсивный chown / chmod для новых файлов в папках php и apache /var/www/html.

ПРИМЕЧАНИЕ: Это на самом деле не решает проблему получения исходного кода из github, но достаточно для моих реальных / непосредственных потребностей в этой конкретной базе кода / проекте.

# 2 - проблема с тегами

Я решил проблему с тегами с помощью ...

docker-compose.yml

version: "3.2"

services:
  php:
    build:
      context: './php/'
      args:
        PHP_VERSION: ${PHP_VERSION:?err}
        TAO_CODE_TAG: ${TAO_CODE_TAG:?err} # <-- IMPORTANT

php / Dockerfile

FROM composer/composer as Composed
ARG TAO_CODE_TAG # <-- IMPORTANT
RUN mkdir /build && cd /build
WORKDIR /build
ADD https://cdn.jsdelivr.net/gh/oat-sa/package-tao@${TAO_CODE_TAG}/composer.json /build/composer.json # <-- IMPORTANT
RUN composer install --ignore-platform-reqs --no-scripts --no-suggest --no-dev

# ...continues

и т. Д.

В настоящее время я решаю проблему установки кода / композитора, дублируя многоэтапную сборку в образе, производном от php и apacheконтейнеры, как показано в строках выше, затем ...

php / Dockerfile

# continued...

ARG PHP_VERSION
FROM php:${PHP_VERSION:+${PHP_VERSION}-}fpm-alpine

RUN apk update \
    # ...etc.

# Gather composed packages from stage above
COPY --from=Composed /build /var/www/html/

# ...etc

К сожалению,это повторяется как для экземпляров php, так и для apache (требуется, чтобы код запекался в обоих случаях). Я все еще исследую способ создания общего ресурса только для источника, который был бы доступен и отображен через общий ресурс (скорее всего).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...