【问题标题】:Docker Container Define user home folderDocker 容器定义用户主文件夹
【发布时间】:2022-02-02 05:45:16
【问题描述】:

我在 docker-compse.yml 中有以下 php 服务

version: '3'

networks:
  laravel:
    driver: bridge

services:
  nginx:
    image: nginx:stable-alpine
    restart: unless-stopped
    ports:
      - "${WEB_PORT}:80"
    volumes:
      - "${PROJECT_DIR}:/var/www/html"
      - "${NGINX_CONFIG}:/etc/nginx/conf.d/default.conf"
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - php
      - mysql
    networks:
      - laravel

  mysql:
    image: mysql:5.7.29
    restart: unless-stopped
    user: "${HOST_UID}:${HOST_GID}"
    tty: true
    ports:
      - "${SQL_PORT}:3306"
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - ./docker/mysql:/var/lib/mysql
    networks:
      - laravel

  php:
    build:
      context: ./docker
      dockerfile: Dockerfile-php
    user: "${HOST_UID}:${HOST_GID}"
    volumes:
      - "${PROJECT_DIR}:/var/www/html"
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      #- "${COMPOSER_CACHE_DIR}:/.composer/cache"
      #- "${COMPOSER_CONFIG}:/.composer/config"
    working_dir: /var/www/html
    networks:
      - laravel

  npm:
    image: node:13.7
    user: "${HOST_UID}:${HOST_GID}"
    volumes:
      - "${PROJECT_DIR}:/var/www/html"
    working_dir: /var/www/html
    entrypoint: ['npm']

当我在容器中运行whoami 时,它会返回:

whoami: cannot find name for user ID 1000

我认为这是一个问题,因为没有主目录,docker-compose exec php ls ~ 返回:

ls: cannot access '/home/clarg': No such file or directory

这会导致docker-compose exec php php artisan tinker 返回:

   ErrorException 

  Writing to directory /.config/psysh is not allowed.

  at vendor/psy/psysh/src/ConfigPaths.php:362
    358▕             @\mkdir($dir, 0700, true);
    359▕         }
    360▕ 
    361▕         if (!\is_dir($dir) || !\is_writable($dir)) {
  ➜ 362▕             \trigger_error(\sprintf('Writing to directory %s is not allowed.', $dir), \E_USER_NOTICE);
    363▕ 
    364▕             return false;
    365▕         }
    366▕ 

      +20 vendor frames 
  21  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

通过谷歌搜索,我看到这是在主目录中,容器中不存在。

我该如何解决这个问题?

编辑:

Dockerfile-php:

FROM php:8.0-fpm

ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions gd zip pdo_mysql

# check https://github.com/mlocati/docker-php-extension-installer#supported-php-extensions for more extensions

COPY --from=composer /usr/bin/composer /usr/bin/composer

php.ini https://pastebin.com/T2iYTZz2

【问题讨论】:

  • 您应该发布您的 Dockerfile,以便我们可以看到实际构建的内容。还有 docker-compose 中 php 服务配置的完整上下文。您遇到的错误可能是其他问题的症状,消除症状只是权宜之计。
  • @Sammitch 我已经更新了问题。

标签: php laravel docker laravel-artisan tinker


【解决方案1】:

您的 docker 容器对主机上可能存在或不存在的用户一无所知,因此,除非您已将这些用户与随附的配置和目录结构一起构建,否则您将得到的唯一结果是为 docker 提供您的本地 UID 和 GID 是“以 root 以外的方式运行容器”,这很好。

但通常您不希望将 docker 容器/映像与启动它的特定环境联系起来,例如:要求容器中存在与本地用户同名的用户,以及与其关联的所有目录之类的。

在这种特定情况下,看起来 artisan 只是想缓存一些配置,您可以使用环境变量控制该配置的位置:

XDG_CONFIG_HOME=/some/writeable/directory

您可以在项目的 Dockerfile、docker-compose 或 .env 文件中进行设置。我建议将其设置在项目目录中的某个位置,但在 docroot 之外。

参考:https://stackoverflow.com/a/62041096/1064767

这对于本地开发人员来说已经足够了,您希望将其挂载到本地工作目录中进行测试,但如果您要构建/部署最终的 docker 映像,则可能需要更多考虑。

【讨论】:

  • 你在这里给了我足够的东西来提出一个稍微不同的解决方案。添加卷到 php service- ./docker/php/tinker_cache:/.config/psysh.
猜你喜欢
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
相关资源
最近更新 更多