run docker-compose yml에서 환경 변수 재사용



docker-compose network (3)

도커 작성 파일 내에서 로컬 환경 변수를 참조 할 수 있습니다. USER_NAMEDB_USER_NAME 과 (와) 동일하게 만들고 싶다고 가정합니다.

docker-compose.yml

version: '2'

services:
  db:
    image: example/db
    ports:
      - "8443:8443" 
    container_name: db
    hostname: db
    environment:
      - USER_NAME = ${USERNAME}
      - USER_PASSWORD = ${PASSWORD}

svc:
  image: example/svc
  depends_on:
    - db
  ports:
    - "9443:9443"
  container_name: svc
  hostname: svc
  environment:
    - DB_URL = https://db:8443
    - DB_USER_NAME = ${USERNAME}
    - DB_USER_PASSWORD = ${PASSWORD}

다음과 같이 docker-compose를 실행합니다.

$ USERNAME="admin" PASSWORD="admin" docker-compose up

또는보다 영구적이고 반복적으로 입력하기가 더 쉬운 경우 :

$ printf '%s\n%s\n' 'export USERNAME="admin"' 'export PASSWORD="admin"' >> ~/.bash_profile
$ source ~/.bash_profile
$ docker-compose up

이 예제에서와 같이 중복을 피하기 위해 여러 컨테이너에서 공유되는 환경 변수를 재사용 할 수 있습니까?

version: '2'

services:

  db:
    image: example/db
    ports:
      - "8443:8443" 
    container_name: db
    hostname: db
    environment:
      - USER_NAME = admin 
      - USER_PASSWORD = admin 

svc:
  image: example/svc
  depends_on:
    - db
  ports:
    - "9443:9443"
  container_name: svc
  hostname: svc
  environment:
    - DB_URL = https://db:8443
    - DB_USER_NAME = admin
    - DB_USER_PASSWORD = admin 

Answer #1

extends 옵션은 좋을 수도 있지만 3.x 작성 파일 에서는 지원되지 않습니다 . 다른 방법은 다음과 같습니다.

  1. 확장 필드 (파일 3.4 이상 작성)

    3.4+ 작성 파일을 사용할 수 있다면 확장 필드가 가장 좋은 옵션 일 수 있습니다.

    docker-compose.yml

    version: '3.4'
    
    x-common-variables: &common-variables
      VARIABLE: some_value
      ANOTHER_VARIABLE: another_value
    
    services:
      some_service:
        image: someimage
        environment: *common-variables
    
      another_service:
        image: anotherimage
        environment:
          <<: *common-variables
          NON_COMMON_VARIABLE: 'non_common_value'
    
  2. env_file 지시문

    docker-compose.yml

    version: '3.2'
    
    services:
      some_service:
        image: someimage
        env_file:
          - 'variables.env'
    
      another_service:
        image: anotherimage
        env_file:
          - 'variables.env'
    

    variables.env

    VARIABLE=some_value
    ANOTHER_VARIABLE=another_value
    
  3. 프로젝트 루트에있는 .env file (또는 실제 작성 환경의 변수)

    .env 파일의 변수는 서비스 구성에서 참조 할 수 있습니다.

    docker-compose.yml

    version: '3.2'
    
    services:
      some_service:
        image: someimage
        environment:
          - VARIABLE
    
      another_service:
        image: anotherimage
        environment:
          - VARIABLE
          - ANOTHER_VARIABLE
    

    .env

    VARIABLE=some_value
    ANOTHER_VARIABLE=another_value
    

Answer #2

extends 지시문을 사용하면 여러 컨테이너가 기본 서비스 설명에서 environment 구성을 상속 받도록 할 수 environment . 예를 들어, base.yml 이라는 파일에 다음을 넣으십시오.

version: '2'

services:
  base:
    environment:
      DB_URL: https://db:8443
      DB_USER_NAME: admin
      DB_USER_PASSWORD: admin 

그런 다음 docker-compose.yml 에서 다음을 수행합니다.

version: '2'

services:
  container1:
    image: alpine
    command: sh -c "env; sleep 900"
    extends:
      file: base.yml
      service: base

  container2:
    image: alpine
    command: sh -c "env; sleep 900"
    extends:
      file: base.yml
      service: base
    environment:
      ANOTHERVAR: this is a test

그런 다음 container1 내부에 다음과 같이 표시됩니다.

DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin

그리고 container2 안에는 다음과 같은 내용이 표시됩니다.

DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
ANOTHERVAR=this is a test

environment 지시문이 아닌 다른 것에 대해서는 extends 를 사용할 수 있습니다. 도커 작성을 사용할 때 중복을 피할 수있는 좋은 방법입니다.





docker-compose