aco*_*ter 7 docker docker-volume
我有一个基于Thelia和Composer 的非常简单的 Dockerfile 。我想要它做的尽可能多的设置成为可能,所以为此,我安装composer在PATH容器内,然后尝试运行composer install。但是,此时,容器中似乎还不存在我的本地/挂载文件(请参阅RUN echo pwd: ...下面的输出)。
构建失败并显示以下错误消息:
Composer 在 /var/www/html 中找不到 composer.json 文件
要初始化项目,请按照https://getcomposer.org/ “入门”部分中的说明创建 composer.json 文件
错误:服务“web”无法构建:命令“/bin/sh -c composer install”返回非零代码:1
请注意,在没有RUN composer install指令的情况下构建然后运行是docker-compose exec web composer install有效的。
docker-compose.yml 中声明的 mount 是否在镜像完全构建后生效?我是否需要明确地显示COPY我的本地文件,以便它们在构建过程中可见?
FROM php:5.6-apache
COPY docker-php-pecl-install /usr/local/bin/
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
libicu-dev \
git \
zip \
libzip-dev \
&& docker-php-ext-install intl pdo_mysql mcrypt mbstring zip calendar \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd \
&& docker-php-pecl-install xdebug-2.3.3
RUN a2enmod rewrite
RUN usermod -u 1000 www-data
COPY config/php.ini /usr/local/etc/php/
COPY config/vhost/vhost.conf /etc/apache2/sites-enabled/
# Expose webroot
VOLUME /var/www/html
WORKDIR /var/www/html
COPY . /var/www/html # Added at Edit 1
# Allow Composer to be run as root
ENV COMPOSER_ALLOW_SUPERUSER 1
# Setup the Composer installer
RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \
&& curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \
&& php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" \
&& php /tmp/composer-setup.php \
&& chmod a+x composer.phar \
&& mv composer.phar /usr/local/bin/composer
# Install composer dependencies
RUN echo pwd: `pwd` && echo ls: `ls` # outputs:
# pwd: /var/www/html
# ls:
RUN composer install
Run Code Online (Sandbox Code Playgroud)
web:
build: ./docker/php
ports:
- "8002:80"
links:
- mariaDB
environment:
SYMFONY_ENV: dev
command: /usr/sbin/apache2ctl -D FOREGROUND
volumes:
- .:/var/www/html
mariaDB:
...
Run Code Online (Sandbox Code Playgroud)
COPY显式 ing 文件之后我COPY . /var/www/html在VOLUME和WORKDIR说明之后添加了一个,并注意到一些奇怪的东西。现在RUN pwd: ...指令回显:
密码:/var/www/html
ls: Dockerfile 配置 docker-php-pecl-install
这是我的 docker/php 目录的内容,不是项目根目录!
完整(ish)目录结构:
.
??? LICENSE.txt
??? Readme.md
??? Thelia
??? bin
? ??? ...
??? bootstrap.php
??? cache
? ??? ...
??? change-version.sh
??? composer.json
??? composer.lock
??? docker
? ??? php
? ??? Dockerfile
? ??? config
? ??? docker-php-pecl-install
??? docker-compose.yml
??? lib
? ??? Thelia
? ??? Project
??? local
? ??? ...
??? log
??? templates
? ??? ...
??? vendor
? ??? ...
??? web
??? favicon.ico
??? index.php
??? index_dev.php
??? robots.txt
Run Code Online (Sandbox Code Playgroud)
所以我修改后的问题是:我如何COPY从我运行的上下文中告诉 Docker docker-compose?我认为这是 的默认行为docker-compose,这就是它在过去项目中为我工作的方式......
您可以使用以下命令定义 docker-compose 1.7 文件:
web:
build: ./docker/php
Run Code Online (Sandbox Code Playgroud)
这基本上导致:
docker build -f ./docker/php/Dockerfile ./docker/php/
Run Code Online (Sandbox Code Playgroud)
所以基本上构建路径是构建过程的上下文。
如果您确实想定义上下文,则必须将 docker-compose 定义至少升级到v2 或 v3。
在那里你应该能够做到:
version: '2'
services:
web:
build:
context: ./
dockerfile: ./docker/php/Dockerfile
Run Code Online (Sandbox Code Playgroud)
我建议不要这样做:
.dockerignore会有所帮助,但您必须将其用作白名单而不是黑名单。如果你想构建多个 php 容器,它们都与你的docker-php-pecl-install文件安装依赖项,我建议你不要注入上帝上下文,而是从它自己的 Dockerfile 创建一个基本 php 镜像,然后在其他容器中引用它Dockerfile 作为FROM源。该基础镜像可以是一个不相关的项目,您所需要做的就是构建一个镜像,并在其他不同的 php 项目中重用。
如果您想在整个公司中重用该映像,那么设置一个私有 docker 注册表会很有帮助,您和您的团队可以从中推送和拉取映像。
| 归档时间: |
|
| 查看次数: |
12843 次 |
| 最近记录: |