我正在尝试在docker中部署symfony应用程序。现在我在Linux服务器上的权限有问题。在我当地的Mac上一切都好。
我有docker-compose.yml
个文件:
version: '3'
volumes:
. :
services:
db:
image: mysql
volumes:
- "./.data/db:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASS}
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_USER: ${DATABASE_USER}
MYSQL_PASSWORD: ${DATABASE_PASS}
php:
build: ./docker/fpm
volumes:
- ./:/var/www/app
nginx:
build: ./docker/nginx
ports:
- ${APP_PORT}:8080
volumes:
- ./.logs/nginx/:/var/log/nginx
- ./:/var/www/app
php
图片的Dockerfile:
FROM php:7.1-fpm-alpine
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version
RUN chown -R www-data:www-data /var/www
USER www-data
WORKDIR /var/www/app
所以一切正常,但是当我尝试运行docker-compose exec php composer install
后,我收到错误:
/var/www/app/vendor does not exist and could not be created.
为什么它只发生在Linux服务器上?
我正在从用户$ docker-compose up
运行myapp
。
UPD :
看起来chown
无法正常工作:
$ docker-compose exec php ls -l /var/www/app
:
total 168
-rw-r--r-- 1 40007 40007 1662 Apr 19 08:44 Makefile
...
所有者不是www-data
UPD2 :
我认为原因是在我们从docker-compose文件中挂载volume
后,它会从该卷中获取规则,这就是chown
没有生效的原因。
这是一个原因。但它有什么美妙的解决方案呢?
答案 0 :(得分:0)
容器内部和卷外部的用户ID在数字上是相同的(除非您的docker守护程序配置了用户名称空间),但可以轻松地使用不同的名称。如果要匹配主机上的用户,请使用数字ID。您应该也设置该组。
在Dockerfile构建中,RUN chown only 会影响进入图像的文件,不在运行时使用绑定装载添加的文件。绑定装置还会在构建时隐藏容器映像内添加的文件。
如果卷所有者因系统而异,则在Dockerfile中引入build-arg。
ARG volumeOwnerGroup
USER $volumeOwnerGroup
使用以下内容进行构建:--build-arg volumeOwnerGroup=$(stat -c '%u:%g' /var/www/app)
在docker-compose文件中,您可以使用args
字典设置build-args。您可以从与.env
相同的目录中的docker-compose.yml
文件中提取值。然后,您只需确保.env
文件适合您的计算机。另请参阅https://vsupalov.com/docker-env-vars/。
答案 1 :(得分:0)
尝试以下
FROM php:7.1-fpm-alpine
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version
RUN mkdir -p /var/www/app \
&& chown -R www-data:www-data /var/www
USER www-data
WORKDIR /var/www/app
答案 2 :(得分:0)
问题:当您使用
docker-compose.yml
卷中的内容时,它会覆盖Dockerfile上的卷,并且您将丢失所有更改 从该卷上的Dockerfile中获取。解决方案::请将PHP卷的另一个路径(供应商)添加到您的
docker-compose.yml
文件中,如下所示:
- ./:/var/www/app
- /var/www/app/vendor