Docker - 执行mkdir,chown&容器启动后的chgrp

时间:2017-09-05 16:01:20

标签: docker docker-compose

我正在尝试使用docker-compose创建一个docker容器,它在本地文件系统上安装一个卷(对于容器的/ var / www / html)然后添加一个名为maps and chowns的目录,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 "$@"

我也尝试过没有任何entrypoint.sh的东西,只需将它添加到composer.yml中(在环境键之后):

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

但是这两种方法似乎都没有在除

之外的docker-compose日志中出错
  

webserver_1退出,代码为0

6 个答案:

答案 0 :(得分:1)

@Fortis和@whites11指出我正在覆盖original PHP 5.6 Dockerfile中现有的CMD。 Dockerfile reference - Understand how CMD and ENTRYPOINT interact中描述了CMD和ENTRYPOINT的各种组合 - 我相信我位于矩阵的右下角,结合了原始Dockerfile中的“CMD exec_cmd”(在本例中为“CMD apache-foreground”)使用ENTRYPOINT [“exec_entry”,“p1_entry”]。

所以,在我的Dockerfile中,我只需要运行在原始Dockerfile中设置的apache-foreground脚本,如下所示:

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

将entrypoint.sh以:

结尾
exec "$@"

这允许我做我需要的(在我的docker-compose.yml中创建一个挂载的卷到本地文件系统,然后使用entrypoint.sh创建和chown + chmod与本地用户在该挂载中的目录&从容器内部分组),然后执行/ apache2-foreground,原始Dockerfile打算。

我最初测试了在entrypoint.sh中运行apache2-foreground,它也有效,但我认为这是一种不太“透明”的方法,我想更好的解耦,以便允许原作者Dockerfile改变了他们的Dockerfile中的CMD而我的设置没有因此而中断,我应该将他们的CMD传递到我的Dockerfile ENTRYPOINT定义中,有点像......

ENTRYPOINT ["/entrypoint.sh", CMD]

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

答案 1 :(得分:0)

php docker图像本身,有自己的command条目和entrypoint,因为你可以看到in its Dockerfile,而你正在覆盖它们。因此,它不是按原样运行apache2-foreground,而是运行自定义命令和入口点,它创建目录,更改权限和退出。请注意,容器必须有一个长时间运行的过程。

相反,你可以将以下命令添加到Dockerfile(没有运行它,可能会发生错误):

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

答案 2 :(得分:0)

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

如果使用自定义脚本覆盖它,则需要调用原始入口点以使图像生效。

检查here,您会看到原始入口点是

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 "$@"

这是未经测试但应该有用。

答案 3 :(得分:0)

您可以在自己的docker文件中添加这些命令(COPY,CHMOD)。

access_ok(…)

查看我的泊坞文件https://github.com/RohanMohite/Docker-Nginx-PHP/blob/master/server1/Dockerfile

如果您需要任何进一步的信息来设置Dockerize PHP应用程序,请查看https://devopsdevelopment.wordpress.com/2017/08/02/how-to-configure-docker-with-nginx-and-php-application/

请告诉我。

答案 4 :(得分:0)

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

RUN usermod -u 1000 www-data

希望这会有所帮助。

答案 5 :(得分:0)

对于docker和WordPress安装插件,模板或创建文件夹的权限问题,可以在 Dockerfile 中使用带有chown参数的命令COPY。如下所示:

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

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

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

但是您需要使用最新版本的Docker才能使用chown参数。很多人会得到未知的chown参数,这是由于Docker版本引起的。因此,在使用chown之前,我指示要更新您的Docker。

  

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

     

有关权限和www-data用户的Wordpress参考:https://codex.wordpress.org/Changing_File_Permissions