@spaceatmoon

Почему docker-compose игнорирует директиву user?

Данный конфиг нормально работает под vagrant, но там какая-то проблема с установкой модулей через npm. Решил перепроверить на нормальном хостинге и на нормальном хостинге npm устанавливается как надо. Однако docker-composer игнорирует директиву user в docker-compose.yml и просто пробрасывает права как есть во внутрь контейнера не изменяя их. Версии композера и докера одинаковые с виртуальной и настоящей vps.

Каждый раз делать chown на хосте под вымышленного пользователя как-то странно. Это похоже на баг.
Dockerfile

FROM php:8.0.12-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libcurl4-openssl-dev \
    libpng-dev \
    libpq-dev \
    libonig-dev \
    libxml2-dev \
    libzip-dev \
    zip \
    unzip

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install curl zip pdo pgsql pdo_pgsql mbstring exif pcntl bcmath gd intl opcache xml

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# nvm environment variables
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 14.16.0
ENV NPM_VERSION 7.6.3

SHELL ["/bin/bash", "--login", "-c"]
RUN mkdir -p $NVM_DIR

# Install nvm with node and npm
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash \
    && . $NVM_DIR/nvm.sh \
    && nvm install $NODE_VERSION \
    && nvm alias default $NODE_VERSION \
    && nvm use default \
    && npm install npm@$NPM_VERSION -g

ENV NODE_PATH $NVM_DIR/versions/node/v$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH
#ENV PATH      $NVM_DIR:$PATH
# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

WORKDIR /var/www

USER $user



docker-compose.yml

version: "3.7"
services:
    app:
        build:
            args:
                user: momo
                uid: 1000
            context: ./dockerfiles
            dockerfile: Dockerfile
        image: appmail
        container_name: appmail-app
        restart: unless-stopped
        working_dir: /var/www/
        volumes:
            - ./:/var/www
        networks:
            - appmail

    db:
        container_name: appmail-db-pgsql
        image: postgres:14
        env_file: ./.env
        environment:
            POSTGRES_DB: ${DB_DATABASE}
            POSTGRES_USER: ${DB_USERNAME}
            POSTGRES_PASSWORD: ${DB_PASSWORD}
            PGDATA: /data/postgres14
        volumes:
            - appmail-db-pgsql14:/data/postgres14
        ports:
            - ${DB_PORT}:5432
        networks:
            - appmail
        restart: unless-stopped

    admin:
        image: adminer
        restart: always
        depends_on:
            - db
        ports:
            - 8082:8080
        networks:
            - appmail

    nginx:
        image: nginx:alpine
        container_name: appmail-nginx
        restart: unless-stopped
        ports:
            - ${APPLICATION_PORT}:80
            #- 433:433
        volumes:
            - ./:/var/www
            - ./docker-compose/nginx:/etc/nginx/conf.d/
        networks:
            - appmail

networks:
    appmail:
        driver: bridge

volumes:
    appmail-db-pgsql14:



-rwxrwxr-x 1 1002 1002   4051 Nov 18 07:20 README.md
Должно быть так:
-rwxrwxr-x 1 momo momo   4051 Nov 18 07:20 README.md
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 1
@mureevms
Как именно проверяете?
Какой UID имеет пользователь momo в контейнере? Вангую, что первый вывод без пользователя у вас в хост системе, поскольку в ней нет пользователя с таким UIDом. А UID пользователя momo в контейнере == 1002

Каждый раз делать chown на хосте под вымышленного пользователя как-то странно. Это похоже на баг.

Все имена пользователей сделаны для удобства человека, система оперирует UIDом. Chown тоже умеет указывать UID, а не username: chown -R 1002:1002 /target
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы