docker:git克隆结果不在本地卷中,args未扩展
我正试图通过Docker站起来。我可以手动让它工作,但我正在尝试改进它(使它在CI/CD环境中更可用),同时遵循最佳实践(例如:单一责任映像等) TLDR:docker:git克隆结果不在本地卷中,args未扩展,git,docker,docker-compose,Git,Docker,Docker Compose,我正试图通过Docker站起来。我可以手动让它工作,但我正在尝试改进它(使它在CI/CD环境中更可用),同时遵循最佳实践(例如:单一责任映像等) TLDR: 如何将git repo可靠地克隆到本地共享卷中 如何从.env文件签出特定的git标记 问题: 将git克隆到映射到本地卷的路径会导致本地路径中没有数据/文件 我发现有文章提到,在构建过程的早期映射一个空卷会导致路径为空(但我认为这并不直接适用于这里) docker compose config将显示TAO\u code\u标记的正确值
- 我发现有文章提到,在构建过程的早期映射一个空卷会导致路径为空(但我认为这并不直接适用于这里)
TAO\u code\u标记的正确值
,但在签出期间失败(视为空)
- 我知道,根据它在dockerfile中的调用方式,变量的shell扩展可能不会发生。但是,我已经看到了使用
的工作示例runecho$var
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:
version: "3.2"
services:
php:
build:
context: './php/'
args:
PHP_VERSION: ${PHP_VERSION:?err}
TAO_CODE_TAG: ${TAO_CODE_TAG:?err} # <-- IMPORTANT
/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
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
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;
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
# 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
/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>
/php/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
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
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;
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
# 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
PS:最终,诸如使用秘密服务器获取安全凭据等,以及使用带有
.env
文件的自动证书等,也将实现。我现在可以进入web安装页面。所以,对于任何感兴趣的人
#1-源/克隆问题
我意识到我所需要的只是和文件,我可以在ADD
中通过抓取,然后在php和apache/var/www/html
文件夹中对新文件进行递归chown/chmod
注意:这并不能真正解决通常从github获取源代码的问题,但足以满足我对这个特定代码库/项目的实际/即时需求
#2-标签问题
我通过……解决了标签问题
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:
version: "3.2"
services:
php:
build:
context: './php/'
args:
PHP_VERSION: ${PHP_VERSION:?err}
TAO_CODE_TAG: ${TAO_CODE_TAG:?err} # <-- IMPORTANT
不幸的是,php和apache实例都重复了这一点(需要将代码烘焙到这两个实例中)。我仍在研究一种创建共享源代码资源的方法,该资源可以通过共享(很可能)访问和映射