Docker, Docker Compose 및 권한

소개



Docker와 Docker Compose는 훌륭합니다. 어제 저는 소프트웨어의 API 위에 사용자 인터페이스를 생성하기 위해 소프트웨어를 설치해야 했습니다. Dockerfile을 다운로드하고, Docker Compose를 사용하여 일부 구성을 추가하고, 이미지를 빌드하고, 컨테이너를 실행하는 데 몇 분 밖에 걸리지 않았습니다. 나는 매우 행복한 Docker와 Docker Compose가 존재하지만 일부improvements on macOS를 보고 싶습니다.

사용자, 그룹 및 파일 권한의 개념도 훌륭합니다. 처음 사용하는 경우 모든 기본 사항을 다루는 this article 을 권장합니다.

문제



작년에 몇 가지 성능 문제로 인해. 스위치는 Docker 볼륨의 속도와 안정성을 확실히 개선했지만 macOS에서는 발생하지 않은 문제가 계속해서 발생했습니다. 파일 권한이 손상되었습니다.

macOS에서 Docker를 사용할 때 파일 권한은 로컬 시스템과 Docker 컨테이너 간에 동기화되지 않습니다. Linux에서는 파일 권한이 동기화됩니다. 제 생각에는 이는 실제로 모든 운영 체제에 적용되어야 하는 방식입니다.

이것은 큰 문제였습니다.

로컬에서 파일을 변경하면 컨테이너 내부에도 존재하지 않는 사용자 및 그룹으로 파일 권한이 컨테이너 내부에서 변경됩니다.

유일한 기존 루트 사용자를 사용하여 컨테이너 내부의 파일을 변경한 경우 파일 권한도 내 로컬 시스템에서 root:root 로 변경됩니다.

당시 구성은 대략 다음과 같았습니다.

클릭하여 Dockerfile 열기


# Define base image
FROM php:8.0-cli-buster




클릭하여 docker-compose.yml을 엽니다.


version: '3.3'

networks:
  web:
    external: true

services:
  application:
    container_name: application
    build:
      context: .
      dockerfile: ./Dockerfile
    networks:
      - web
    volumes:
      - ./:/var/www/html/
    restart: always



우리는 다음과 같은 명령을 실행하곤 했습니다.

docker-compose exec application bash


해결책



로컬에서 사용하는 것과 동일한 ID로 Docker 컨테이너 내부에 사용자 및 그룹을 생성합니다. 이 작업이 완료되면 동일한 사용자 및 그룹이 사용되므로 파일 권한을 동기화할 수 있습니다.

처음에는 셸 구성에서 사용자 및 그룹 ID를 내보내야 합니다(예: ~/.zshrc 또는 ~/.bashrc ).

# Export variables for Docker and Docker Compose
export USER_ID=$(id -u)
export GROUP_ID=$(id -g)


이제 구성은 대략 다음과 같습니다.

클릭하여 Dockerfile 열기


# Define base image
FROM php:8.0-cli-buster

# Define build arguments
ARG USER_ID
ARG GROUP_ID

# Define environment variables
ENV USER_ID=$USER_ID
ENV GROUP_ID=$GROUP_ID
ENV USER_ID=${USER_ID:-1001}
ENV GROUP_ID=${GROUP_ID:-1001}

# Add group and user based on build arguments
RUN addgroup --gid ${GROUP_ID} alice
RUN adduser --disabled-password --gecos '' --uid ${USER_ID} --gid ${GROUP_ID} alice

# Set user and group of working directory
RUN chown -R alice:alice /var/www/html




클릭하여 docker-compose.yml을 엽니다.


version: '3.3'

networks:
  web:
    external: true

services:
  application:
    container_name: application
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        USER_ID: $USER_ID
        GROUP_ID: $GROUP_ID
    networks:
      - web
    volumes:
      - ./:/var/www/html/
    restart: always



이제부터는 새로 생성된 사용자를 사용하여 컨테이너 내부에서 명령을 실행해야 합니다. 이제 다음과 같은 명령을 실행합니다.

docker-compose exec --user alice application bash


추가 읽기



Docker 및 Docker Compose를 사용하는 로컬 개발 환경에 대해 자세히 알아보려면 얼마 전에 동료가 쓴 글을 참조하세요.

좋은 웹페이지 즐겨찾기