DockeR语言 在容器启动后执行 mkdir、chown 和 chgrp



我正在尝试使用docker-compose创建一个docker容器,该容器在本地文件系统上安装了卷(对于容器的/var/var/www/html),然后添加一个名字地图,chan和chmods是www-data,以便Web服务器可以将文件写入其中。

我尝试了几种方法,使用了一个entrypoint.sh脚本:

dockerfile

FROM php:5.6-apache
COPY apache-config.conf /etc/apache2/sites-enabled/000-default.conf
RUN a2enmod rewrite headers
RUN service apache2 restart
COPY entrypoint.sh /entrypoint.sh
RUN chmod 0755 /entrypoint.sh

docker-compose.yml({}中的东西仅来自.env文件)

version: '2'
services:
  webserver:
    build: ./docker/webserver
    image: web
    ports:
      - "8080:80"
    volumes:
      - ./web:${APACHE_DOC_ROOT}
    links:
      - db
    environment:
      - HTTP_ROOT=http://${DOCKER_HOST_IP}:${DOCKER_HOST_PORT}/
      - PHP_TMP_DIR=${PHP_TMP_DIR}
      - APACHE_LOG_DIR=${APACHE_LOG_DIR}
      - APACHE_DOC_ROOT=${APACHE_DOC_ROOT}/
      - SERVER_ADMIN_EMAIL=${SERVER_ADMIN_EMAIL}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}

entrypoint.sh

#!/bin/sh
mkdir /var/www/html/maps
chown www-data /var/www/html/maps
chgrp www-data /var/www/html/maps
exec "$@"

我也尝试过没有任何入门点。

    command: bash -c "mkdir /var/www/html/maps && chown www-data /var/www/html/maps && chgrp www-data /var/www/html/maps"

但是,这两种方法似乎都没有在docker-compose日志中没有错误

Weberver_1用代码0

退出

不确定您是否仍然存在此问题,但也许添加此问题会对您有所帮助。我的意思是,它解决了我的问题 - 在容器上运行的PHP脚本没有写入权限。

RUN usermod -u 1000 www-data

希望这会有所帮助。

as @fortis和 @whites11指出,我在原始PHP 5.6 Dockerfile中覆盖了现有的CMD。dockerfile参考中描述了CMD和入口点的各种组合 - 了解CMD和入口点的交互方式 - 我相信我在矩阵的底部,将" CMD Exec_cmd"结合在原始Dockerfile(在这种情况下为" CMD Apache" CMD Apache)-foreground")带入口处[" exec_entry"," p1_entry"]。

所以,在我的dockerfile中,我只需要运行原始Dockerfile中设置的Apache-Frodrougground脚本,例如:

ENTRYPOINT ["/entrypoint.sh", "apache2-foreground"]

并离开入口处以:

结尾
exec "$@"

这使我能够做我需要的事情(在我的docker-compose.yml中创建一个安装的卷到本地文件系统,然后使用entrypoint.sh使用本地用户来创建和Chown chmod chomod chmod chmod一个目录&组从容器内部),然后执行/apache2-Foreground作为原始Dockerfile打算。

我最初从entrypoint.sh内部测试了运行apache2-froverground,但它也有效,但我认为这是一种较不``透明''的方法,我猜想可以更好地解耦,以便允许原始的作者Dockerfile更改其Dockerfile中的CMD,并且我的设置不会因此而打破,我应该将其CMD的任何内容传递到我的Dockerfile入口点定义中,有点像...

ENTRYPOINT ["/entrypoint.sh", CMD]

但我不知道这是否可能吗?

用于Docker和WordPress安装插件,模板或创建文件夹的权限问题,您可以在 dockerfile 中使用命令COPY。如下:

COPY [--chown=<user>:<group>] <src>... <dest>

例如,在我的代码runnig wordpress中,我使用:

COPY --chown=www-data:www-data ./app/ /var/www/html/ 

但是您需要使用Chown参数的最后一个版本。许多人获得了未知的Chown参数,这是由于Docker版本而发生的。因此,在使用Chown之前,我表示要更新您的Docker。

关于复制命令的Docker参考:https://docs.docker.com/engine/reference/builder/#copy

WordPress引用有关权限和www-data用户:https://codex.wordpress.org/changing_file_permissions

php docker映像本身,具有自己的command输入和entrypoint,您可以在其Dockerfile中看到,并且您正在覆盖它们。因此,它没有运行apache2-foreground,而是运行您的自定义命令和入口点,该命令和入口点会创建目录,更改权限和退出。请注意,容器必须长时间运行。

取而代之

RUN mkdir -p /var/www/html/ && chown www-data /var/www/html/maps && chgrp www-data /var/www/html/maps

,或者如果您不关心单层运行它们,则可以在单独的RUN语句中打破它们。

您还应删除以下行:

COPY entrypoint.sh /entrypoint.sh
RUN chmod 0755 /entrypoint.sh

然后再次运行docker-compose build webserver

php:5.6-apache图像已经定义了入口点。

如果您使用自定义脚本覆盖它,则需要调用原始入门点才能使图像工作。

在这里检查,您会看到原始入口点是

ENTRYPOINT ["docker-php-entrypoint"]

您可以尝试从脚本执行它,例如:

#!/bin/sh
mkdir /var/www/html/maps
chown www-data /var/www/html/maps
chgrp www-data /var/www/html/maps
docker-php-entrypoint "$@"

这是未经测试的,但应该起作用。

您可以在docker文件中添加这些命令(副本,chmod)。

# Copy FileDirectory public html pages
  COPY FileDirectory/var/www/html /var/www/html
  RUN chmod +x /var/www/html

请查看我的Docker文件https://github.com/rohanmohite/docker-nginx-php/blob/master/master/server1/dockerfile

如果您需要任何其他信息来设置Dockerize php应用程序 - 应用/

请让我知道。

最新更新