Docker – 在容器启动后执行mkdir,chown&chgrp

我正在尝试使用docker-compose创build一个docker-compose,它在本地文件系统(为容器的/ var / www / html)上添加一个卷,然后添加一个名为maps和chowns的目录,chmods是www-data,以便networking服务器可以写入文件。

我已经尝试了几个方法,使用像这样的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退出

PHP泊坞窗图像本身,它有自己的command入口和entrypoint ,你可以看到它的Dockerfile ,你重写它们。 因此,它并不像运行apache2-foreground那样运行自定义的命令和入口点,这会创build目录,更改权限并退出。 请注意,容器要保持长时间的运行。

相反,您可以将以下命令添加到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

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

这是未经testing,但应该工作。

你可以在docker文件里面自己添加这些命令(COPY,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/server1/Dockerfile

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

请让我知道。

正如@Fortis和@ whites11指出的,我重写了原来的PHP 5.6 Dockerfile中的现有CMD。 在Dockerfile参考中描述了CMD和ENTRYPOINT的各种组合- 了解CMD和ENTRYPOINT如何交互 – 我相信我在matrix的右下angular,结合原始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中创build一个挂载的卷到本地文件系统,然后使用entrypoint.sh创buildchown + chmod中的本地用户和组在容器内部),然后执行/ apache2-foreground作为原始的Dockerfile的意图。

我最初testing在entrypoint.sh中运行apache2-foreground,也是可行的,但我认为这是一个不太“透明”的方法,为了让原始的Dockerfile的作者可以改变, CMD在他们的Dockerfile和我的设置没有因此而中断,我应该通过他们的CMD到我的Dockerfile ENTRYPOINT定义,有点像…

 ENTRYPOINT ["/entrypoint.sh", CMD] 

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

不知道如果你仍然有这个问题,但也许增加这将帮助你。 我的意思是,它解决了我的问题 – 容器上运行的PHP脚本没有写权限。

 RUN usermod -u 1000 www-data 

希望这会有所帮助。