docker-compose useradd 告诉我用户已经存在

Cod*_*rit 1 windows docker docker-compose

我在 Windows 上使用 Docker 并使用以下 docker 文件:

FROM php:7.4-fpm

ARG uid=1000
ARG user=devuser

USER root
# Install system packages
RUN apt-get update && apt-get install -y apt-transport-https && apt-get install -y git curl zip unzip libicu-dev

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

# Install php extensions
RUN docker-php-ext-install pdo_mysql intl iconv

RUN useradd -G www-data,root -u $uid -d /home/$user $user

RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user

# Install composer
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer

# Copy project files to image
COPY . /var/www

# Set working directory
WORKDIR /var/www

RUN composer install

# Change user
USER $user
Run Code Online (Sandbox Code Playgroud)

docker-compose.yaml

version: "3.7"

services:

  app:
    container_name: app
    build:
      context: ./
      dockerfile: Dockerfile
    image: php:7.4-fpm
    ports:
      - 9000:9000
    working_dir: /var/www/
    volumes:
      - ./:/var/www
    networks:
      - dev
    depends_on:
      - database


  server:
    container_name: server
    image: nginx:1.21.0-alpine
    ports:
      - 8000:80
    volumes:
      - ./:/var/www
      - ./docker/nginx:/etc/nginx/conf.d
    networks:
      - dev


  database:
    container_name: database
    image: mariadb:10-bionic
    environment:
      MYSQL_ROOT_PASSWORD: root
    networks:
      - dev
    volumes:
      - database-data:/var/lib/mysql

volumes:
  database-data:
networks:
  dev:
    external: true

Run Code Online (Sandbox Code Playgroud)

它在第一次运行时有效,但当我想进行更改时,出现以下错误。我已经尝试过停止、杀死、关闭所有容器,但没有任何效果。

当我运行时,docker-compose up --force-recreate --build -d我得到以下输出:

 => ERROR [stage-0  5/10] RUN useradd -G www-data,root -u 1000 -d /home/devuser devuser                                                                                  0.4s
------
 > [stage-0  5/10] RUN useradd -G www-data,root -u 1000 -d /home/devuser devuser:
#8 0.354 useradd: user 'devuser' already exists
------
executor failed running [/bin/sh -c useradd -G www-data,root -u $uid -d /home/$user $user]: exit code: 9
ERROR: Service 'app' failed to build : Build failed
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种情况?容器不是封装的吗?设置新环境时如何发生冲突?我已停止所有正在运行的容器

编辑:例如,当我更改uid和时,它会再次工作一次user1001devuser1

BMi*_*tch 6

您已将正在构建的映像命名为与基础映像相同的名称:

image: php:7.4-fpm
Run Code Online (Sandbox Code Playgroud)

这意味着每次运行构建时,您都会添加更多层并从上次构建中进行变异,而不是从原始基础映像重新创建。

解决方法是将您的图像命名为您独有的名称,而不是使用上游库图像名称。

image: <your_hub_user>/app:latest
Run Code Online (Sandbox Code Playgroud)

然后再次拉取上游库映像,将其恢复到已知的干净状态:

docker pull php:7.4-fpm
Run Code Online (Sandbox Code Playgroud)