2017-09-05 138 views
0

我試圖用本地文件系統(容器的/ var/www/html)裝載卷的docker-compose創建docker容器,然後添加一個名爲maps和chowns的目錄,並將chmods添加到www-data中,以便Web服務器可以向其中寫入文件。Docker - 在容器啓動後執行mkdir,chown&chgrp

我試過幾個方法,使用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 

泊塢窗,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 "[email protected]" 

我也試過,沒有任何的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-沒有錯誤比

webserver_1其他組成日誌退出,代碼爲0

回答

0

正如@Fortis和@whites11指出的,我重寫了original PHP 5.6 Dockerfile中現有的CMD。在Dockerfile reference - Understand how CMD and ENTRYPOINT interact中描述了CMD和ENTRYPOINT的各種組合 - 我相信我位於矩陣的右下角,將原始Dockerfile(本例中爲「CMD apache-foreground」)的「CMD exec_cmd」與ENTRYPOINT [ exec_entry「,」p1_entry「]。

所以,在我Dockerfile我只需要運行Apache的前景腳本,這是建立在原有的Dockerfile,像這樣:

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

而離開entrypoint.sh結尾:

exec "[email protected]" 

這允許我做我需要的事情(在我的docker-compose.yml中創建一個掛載的捲到本地文件系統,然後使用entrypoint.sh創建並chown + chmod該掛載本地用戶&羣內容器)和然後執行/ apache2-foreground作爲原始的Dockerfile的意圖。

我最初測試的是在entrypoint.sh中運行apache2-foreground,它也可以工作,但我認爲這是一個不太「透明」的方法,我猜想爲了更好的解耦,以便讓作者原來Dockerfile改變CMD在他們Dockerfile和我的建立不破,結果,我應該通過什麼他們CMD是爲我Dockerfile入口點的定義,有點像......

ENTRYPOINT ["/entrypoint.sh", CMD] 

但我不不知道這是可能的嗎?

0

PHP的泊塢窗圖像本身,都有它自己的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

+0

謝謝@Fortis,你是正確的重寫原始Dockerfile中的CMD我沒有發現 - 但沒有使用入口點腳本的問題,因爲你建議當我然後從我的本地文件系統從容器中的/ var/www/html中,我們已經從/ var/www/html內部的Dockerfile所做的更改被覆蓋。在你的幫助下,我找到了一個使用入口腳本的答案 - 請看我的答案,並讓我知道你的想法也許... –

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 "[email protected]" 

這是未經測試,但應該工作。

+0

謝謝@ whites11 - 你說得對我重寫CMD,我不明白 - 但是當我實現了你的建議,同時運行endpoint.sh和創建的目錄等,webserver永遠不會webserver容器出現 - docker-compose日誌給出: 「gastrakweb_webserver_1退出代碼0」 - 但你的答案幫我想通了 - 我想 - 請參閱/評論我的回答... –

0

您可以在Docker文件中自行添加這些命令(COPY,CHMOD)。

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

看一看我的搬運工文件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/

請讓我知道。

+0

謝謝,除了我不想複製或chmod。根據這個問題,我想從docker-compose掛載一個本地卷(例如,在你想擁有這些文件的本地編輯能力的開發環境中),然後在其中創建並chown/chmod一個目錄,這樣web服務器有能力寫入它。 –

0

不知道你是否仍然有這個問題,但也許增加這個會幫助你。我的意思是,它解決了我的問題 - 在容器上運行的PHP腳本沒有寫權限。

RUN usermod -u 1000 www-data 

希望這會有所幫助。