Docker - 容器启动后执行 mkdir、chown 和 chgrp

Mr *_*enn 4 docker docker-compose

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

我尝试了几种方法,使用如下所示的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
Run Code Online (Sandbox Code Playgroud)

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}
Run Code Online (Sandbox Code Playgroud)

入口点.sh

#!/bin/sh

mkdir /var/www/html/maps
chown www-data /var/www/html/maps
chgrp www-data /var/www/html/maps
exec "$@"
Run Code Online (Sandbox Code Playgroud)

我也尝试过不使用任何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"
Run Code Online (Sandbox Code Playgroud)

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

webserver_1 退出,代码为 0

小智 5

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

RUN usermod -u 1000 www-data
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助。