我在 docker 设置中遇到了一些先有鸡还是先有蛋的问题。在我的Dockerfile
中,我安装了nginx,php和所需的配置。我还在那里安装了作曲家:
FROM ubuntu
RUN apt-get update && apt-get install -y
curl
nginx
nodejs
php7.0-fpm
php-intl
php-pgsql
RUN rm -rf /var/lib/apt/lists/* &&
echo "ndaemon off;" >> /etc/nginx/nginx.conf &&
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin &&
chown -R www-data:www-data /var/www/
COPY orocrm /etc/nginx/sites-available/
RUN ln -s /etc/nginx/sites-availabe/orocrm /etc/nginx/sites-enabled/orocrm
CMD nginx
现在,下一步是通过 composer 实际安装项目目录中的所有依赖项。这就是麻烦开始的地方:由于这是我的开发机器,我不想将我的本地项目文件复制到 docker 容器中。相反,我把它安装在我的docker-compose.yml
:
version: '3'
services:
web:
...
volumes:
- "./crm-application:/var/www/orocrm/"
我无法将composer install
放入 Dockerfile 中,因为目录的挂载(在我的 docker-compose 文件中)是在 Dockerfile 运行后进行的。
这里最好的解决方案是什么?我想到的另一个选项是将文件复制到容器中,然后使用文件观察程序将更改的文件scp
到容器中。不过,这不是一个不错的解决方案。
更新我想强调一下我的实际问题是什么:我在我的开发机器上,我想不断更新代码并立即镜像更改,而无需再次构建映像。因此,COPY
不是一种选择。
我的建议是使用COPY
命令将内容复制到容器中,如下所示
FROM ubuntu
COPY ./crm-application /var/www/orocrm/
RUN apt-get update && apt-get install -y
curl
nginx
nodejs
php7.0-fpm
php-intl
php-pgsql
RUN rm -rf /var/lib/apt/lists/* &&
echo "ndaemon off;" >> /etc/nginx/nginx.conf &&
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin &&
chown -R www-data:www-data /var/www/ &&
composer install
COPY orocrm /etc/nginx/sites-available/
RUN ln -s /etc/nginx/sites-availabe/orocrm /etc/nginx/sites-enabled/orocrm
CMD nginx
为什么?这样你就不需要使用 docker-compose 或其他系统了。您将能够运行单个容器。 即使你想使用 docker-compose,你也在使用一个允许你更新容器内代码的卷。
请注意,我在Docker
中添加了composer install
,因为在生成时,您已经拥有容器中的代码。
问候 伊迪尔!