Compose: μ»¨ν…Œμ΄λ„ˆ λΉŒλ“œμ—λŠ” ν™˜κ²½ λ³€μˆ˜κ°€ μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2015λ…„ 08μ›” 10일  Β·  16μ½”λ©˜νŠΈ  Β·  좜처: docker/compose

μ»¨ν…Œμ΄λ„ˆλ₯Ό λΉŒλ“œ ν•  λ•Œ ν™˜κ²½ λ³€μˆ˜κ°€ μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

docker-compose.yml :

img:
    build: img
    environment:
        VAR: Hello

/ img / Dockerfile :

FROM python:2.7
RUN python -c 'import os; print os.environ["VAR"]'

"Hello"κ°€ μž‘μ„± 될 κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜κ³  KeyError: VAR μˆ˜μ‹ -ν™˜κ²½ λ³€μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€.

docker-compose run --rm img bash (λ§ˆμ§€λ§‰ μ‹€νŒ¨ν•œ 쀄을 μ œκ±°ν•œ ν›„)둜 μ»¨ν…Œμ΄λ„ˆμ— λ“€μ–΄κ°€μ„œ python -c 'import os; print os.environ["VAR"]' λ₯Ό μˆ˜ν–‰ν•˜λ©΄ μ˜ˆμƒ ν•œ κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

docker-compose==1.3.3

docker-version :

Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64
kinquestion

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이 μŠ€νƒ μ˜€λ²„ν”Œλ‘œ μ§ˆλ¬Έμ— λŒ€ν•œ 닡변은 https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile에 λ„μ›€μ΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

.env ν™˜κ²½ λ³€μˆ˜λ₯Ό ARGS에 λ§€ν•‘ν•˜μ—¬ λΉŒλ“œν•˜λŠ” λ™μ•ˆ Dockerfileμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

docker-compose.yml

version: "2"
services:

  lumen:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        - PORT=${PORT}
    volumes:
       ...

Dockerfile

FROM php:7.0-apache
ARG PORT

ENV PORT "$PORT"

EXPOSE ${PORT}
...

λͺ¨λ“  16 λŒ“κΈ€

이것은 μ˜ˆμƒλ©λ‹ˆλ‹€. environment: ν‚€ docker-compose.yml λ°›λŠ” μ‚¬λžŒμ„ μ§€μ •ν•˜λŠ” 것과 λ™μΌν•˜λ‹€ docker run 용기λ₯Ό μ‹œμž‘ν•˜λŠ” λͺ…λ Ή. build 및 dockerfile λŠ” 이미지 λΉŒλ“œμ— μ‚¬μš© 된 이전 ν‚€μž…λ‹ˆλ‹€.

이것은 λ¬Έμ„œμ—μ„œ λͺ…ν™•ν•˜μ§€ μ•Šμ„ 수 있으며 κ°œμ„  될 수 μžˆμŠ΅λ‹ˆλ‹€.

DockerλŠ” λΉŒλ“œ ν™˜κ²½μ— ν™˜κ²½μ„ μ£Όμž…ν•˜λŠ” 것을 μ§€μ›ν•˜μ§€ μ•Šμ§€λ§Œ (Dockerfile의 일뢀 μ—¬μ•Ό 함) 이와 같은 지원을 μΆ”κ°€ν•˜κΈ°μœ„ν•œ 곡개 μ œμ•ˆμ΄ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

이 문제λ₯Ό 발견 ν•œ λͺ¨λ“  μ‚¬λžŒμ„μœ„ν•œ μ°Έμ‘° μΌλΏμž…λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” λΉŒλ“œ μ‹œκ°„ λ³€μˆ˜μ— λŒ€ν•œ docker 토둠이 μžˆμŠ΅λ‹ˆλ‹€. https://github.com/docker/docker/issues/14634 및 ν•΄λ‹Ή PR : https://github.com/docker/docker / ν’€ / 15182

이것은 우리λ₯Ό μ–΄λ ΅κ²Œ λ§Œλ“€κ³  μ •λ§λ‘œ 더 λ‚˜μ€ λ¬Έμ„œκ°€ ν•„μš”ν•©λ‹ˆλ‹€.

λ¬Έμ„œλŠ” 정말 ν˜Όλž€ μŠ€λŸ½μŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ docker-compose.yml 에 μ‚¬μš©λ˜κ³  docker run μ‚¬μš©λ˜λŠ” env-file에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•©λ‹ˆλ‹€. docker-composeκ°€ μ»¨ν…Œμ΄λ„ˆλ₯Ό λΉŒλ“œν•˜κ³  μ‹€ν–‰ν•˜κΈ°μœ„ν•œ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ λ„κ΅¬λΌλŠ” 점을 κ°μ•ˆν•  λ•Œ --env <key>=<value> λ˜λŠ” 이와 μœ μ‚¬ν•œ 것을 μ‚¬μš©ν•˜μ—¬ ν™˜κ²½μ΄ λΉŒλ“œ μ‹œκ°„μ— μ μš©λœλ‹€κ³  κ°€μ •ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.

λ‚˜λ„ λ¬Όμ—ˆλ‹€.
ν™˜κ²½ λ³€μˆ˜λŠ” compose νŒŒμΌμ—μ„œ λΉŒλ“œ 인수둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 μŠ€λ ˆλ“œμ˜ λ‹€λ₯Έ μ‚¬λžŒλ“€κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μ²˜μŒμ—λŠ” env_file λ˜λŠ” ν™˜κ²½μ΄ λΉŒλ“œμ™€ μ‹€ν–‰ λͺ¨λ‘μ—μ„œ μ‚¬μš©λ  κ²ƒμœΌλ‘œ μ˜ˆμƒν–ˆμŠ΅λ‹ˆλ‹€.
compose 파일 v2, docker-compose v1.7, docker-engine v1.11으둜 ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

https://github.com/docker/compose/pull/3747의 μ—…λ°μ΄νŠΈ 된 λ¬Έμ„œ

νŒŒμΌμ—μ„œ ν™˜κ²½ λ³€μˆ˜λ₯Ό ν¬ν•¨ν•΄μ•Όν•˜λŠ” 경우 λ‹€μŒμ„ μˆ˜ν–‰ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 (도컀 μž‘μ„± λΉŒλ“œ μ„Ήμ…˜μ—μ„œ) μ΄λŸ¬ν•œ λ³€μˆ˜μ—μ„œ μ„€μ •λœ 인수λ₯Ό ν•„μš”λ‘œν•˜λ©°, 그런 λ‹€μŒ 도컀 νŒŒμΌμ—μ„œ μ°Έμ‘° ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, env_file을 직접 μž¬μ‚¬μš© ν•  μˆ˜λŠ” μ—†μ§€λ§Œ μ•½κ°„μ˜ μΆ”κ°€ μž‘μ—…μœΌλ‘œ κ·Έλ ‡κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

env $(cat vars.env | xargs) docker-compose up --build <whatever>

이 μŠ€νƒ μ˜€λ²„ν”Œλ‘œ μ§ˆλ¬Έμ— λŒ€ν•œ 닡변은 https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile에 λ„μ›€μ΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

.env ν™˜κ²½ λ³€μˆ˜λ₯Ό ARGS에 λ§€ν•‘ν•˜μ—¬ λΉŒλ“œν•˜λŠ” λ™μ•ˆ Dockerfileμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

docker-compose.yml

version: "2"
services:

  lumen:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        - PORT=${PORT}
    volumes:
       ...

Dockerfile

FROM php:7.0-apache
ARG PORT

ENV PORT "$PORT"

EXPOSE ${PORT}
...

@williamli μŠ€νƒ μ˜€λ²„ν”Œλ‘œ μ§ˆλ¬Έμ— λŒ€ν•œ 링크λ₯Ό μΆ”κ°€ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

μ£„μ†‘ν•©λ‹ˆλ‹€.이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법을 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. 사전 μ œμž‘ 된 이미지λ₯Ό μ‚¬μš©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λ‚΄ μž‘μ„± νŒŒμΌμ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

버전 : '3'

μ„œλΉ„μŠ€:
web1 :
이미지 : softwaremaker / web-w
ν™˜κ²½:

  • wtmsdemo_customerapi01 = http : // api1 / api / values
    포트 :
  • "89:80"
    Depend_on :
  • api1
    API :
    이미지 : softwaremaker / api-w
    λ„€νŠΈμ›Œν¬ :
    κΈ°λ³Έ:
    μ™ΈλΆ€:

이름 : nat

api 이미지 (softwaremaker / api-w)κ°€ μœ„μ—μ„œ μ„€μ • ν•œ ν™˜κ²½ λ³€μˆ˜λ‘œ 해석 될 수 μžˆλ‹€κ³  μƒκ°ν–ˆμ§€λ§Œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λΏ‘ 빡뀨
λ‚΄ μ›λž˜ λŒ“κΈ€μ— stackoverflow 링크λ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile

이 λ¬Έμ œλŠ” κΈ°λ³Έ .env 파일 μ΄μ™Έμ˜ env 파일과 μ—¬μ „νžˆ 관련이 μžˆμŠ΅λ‹ˆλ‹€.
Fe Next μ½”λ“œκ°€ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  nginx:
    env_file:
      - .env
      - .env.local
    environment:
     - SERVER_NAME=${SERVER_NAME}
    build:
      context: ./nginx
      dockerfile: Dockerfile
      args:
        server_name: ${SERVER_NAME}

SERVER_NAME은 두 번째 env 파일 ( .env.local )에 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
μ»¨ν…μŠ€νŠΈλ₯Ό λΉŒλ“œν•˜κΈ° μœ„ν•΄ .env.localμ—μ„œ env varsλ₯Ό μ „λ‹¬ν•˜λŠ” μ˜΅μ…˜μ΄ μ—†μŠ΅λ‹ˆλ‹€ ((

리λͺ¨νŠΈ
λ‚˜λŠ” 파일이 ν˜ΈμΆœλ˜λŠ” 경우 그듀은 단지 λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€μ— μ „λ‹¬λ˜λŠ” λΉŒλ“œν•˜λŠ” λ™μ•ˆ μ‚¬μš©λ˜λŠ” λ³€μˆ˜κ°€ μžˆλ‹€λ©΄ λ‚˜λŠ”λΏλ§Œ μ•„λ‹ˆλΌμ΄λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€ .env 그듀은 이름을 μ§€μ •ν•˜λŠ” 경우 .env.docker κ·Έλ“€μ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ μ£Όμ›Œ. env_file κ°€ .env.docker νŒŒμΌμ„ μ‚¬μš©ν•˜λ„λ‘ μ§€μ •λœ κ²½μš°μ—λ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€.

λ‚΄ λΉŒλ“œ 쀑에 λ‹€λ₯Έ μ΄λ¦„μ˜ env νŒŒμΌμ„ λ³΅μ‚¬ν•˜κ³  .env둜 이름을 λ°”κΎΈλŠ” λ™μ•ˆ λ‚΄ μ†”λ£¨μ…˜

COPY .env.docker ${APP_HOME}/.env
WORKDIR $APP_HOME

κ·Έ ν›„ μ»¨ν…Œμ΄λ„ˆκ°€ 싀행될 λ•Œ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„ νƒν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ˜€μŠ΅λ‹ˆλ‹€.

운영 체제 : macOS (10.14.6)
Docker λ°μŠ€ν¬ν†± 버전 : 2.1.0.5 (40693)
엔진 버전 : 19.03.5
μž‘μ„± : 1.24.1

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„,

μ—¬λŸ¬λΆ„ λͺ¨λ‘μ—κ²Œ κ°„λ‹¨ν•œ μ§ˆλ¬Έμž…λ‹ˆλ‹€. 이것이 개발자 용 이미지λ₯Ό κ΅¬μΆ•ν•˜λŠ” 더 쒋은 방법이 λ κΉŒμš”? μ§€κΈˆκΉŒμ§€λŠ” 잘 μž‘λ™ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것이 ꢌμž₯λ˜λŠ” λ°©λ²•μž…λ‹ˆκΉŒ? λͺ¨λ“  μ΄λ―Έμ§€λŠ” λ²„μŠ€ν„°λ₯Ό κΈ°λ°˜μœΌλ‘œν•©λ‹ˆλ‹€.

```
redis : busterμ—μ„œ redis둜
mkdir / env && env> /env/.env_redis μ‹€ν–‰
μ‹€ν–‰ 고양이 / etc / passwd
ls -lah / home μ‹€ν–‰
λ£¨λΉ„μ—μ„œ : λ£¨λΉ„λ‘œ 슬림 λ²„μŠ€ν„°
mkdir / env && env> /env/.env_ruby μ‹€ν–‰

FROM λ…Έλ“œ : lts-buster-slim AS λ…Έλ“œ
mkdir / env && env> /env/.env_node μ‹€ν–‰

nginx λΉŒλ“œ

nginxμ—μ„œ : μ΅œμ‹  AS nginx
mkdir / env && env> /env/.env_nginx μ‹€ν–‰

PHP λΉŒλ“œ

php : fpm-buster AS phpμ—μ„œ

php : 7.3.14-fpm-buster AS phpμ—μ„œ

mkdir / env && env> /env/.env_php μ‹€ν–‰
볡사 --from = redis / /
볡사 --from = ruby ​​/ /
볡사 --from = node / /
볡사 --from = nginx / /

conf / include-site.conf /etc/nginx/conf.d/include-site.conf μΆ”κ°€
conf / supervisord.conf /etc/supervisord.conf μΆ”κ°€

λ£¨νŠΈμ—μ„œ μ‹€ν–‰
λ…ΈμΆœ 80443
WORKDIR "/ var / www / html"

ENTRYPOINT [ "/ bin / bash", "/start.sh"]

λ¬Έμ œκ°€ μ—¬μ „νžˆ μ‘΄μž¬ν•©λ‹ˆλ‹€.
λΉŒλ“œ μ„Ήμ…˜μ˜ env_file ν‚€λŠ” env varsλ₯Ό argsλ₯Ό 톡해 μ»¨ν…Œμ΄λ„ˆ λΉŒλ“œλ‘œ μ „λ‹¬ν•˜λŠ” 것보닀 더 λͺ…ν™•ν•©λ‹ˆλ‹€.
μ΄λ ‡κ²Œ :

#NOT_WORKING
build:
      context: ./client
      dockerfile: Dockerfile
      env_file: ${CURRENT_ENV_FILE}

μ…Έ 슀크립트λ₯Ό μ‚¬μš©ν•˜μ—¬ Dockerλ₯Ό μž‘μ„±ν•˜κ³  κ΅¬μ„±ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
ν”„λ‘œλ•μ…˜μ„ μœ„ν•΄μ„œλŠ” dev / localκ³Ό λ‹€λ₯Έ env_file이 ν•„μš”ν•©λ‹ˆλ‹€.
그리고 argsκ°€ λ§Žμ€ docker-compose.env.yml 파일이 많기 λ•Œλ¬Έμ— 생각보닀 νŽΈλ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것에 λŒ€ν•΄ μš°μ•„ν•œ 방법이 ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ‚˜λŠ” 도컀 ꡬ문을 정말 μ’‹μ•„ν•˜κ³  ν™˜κ²½ λ³€μˆ˜ λŒ€μ‹  인수λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 λ‚˜μ—κ²Œ μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€. λˆ„κ΅°κ°€κ°€ λ‚΄ 도컀 μž‘μ„± νŒŒμΌμ„ μˆ˜λ™μœΌλ‘œ λ³€κ²½ν•˜λŠ” 것을 μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. .env 파일의 값을 λ³€κ²½ν•˜λŠ” 것은 λ‚˜μ—κ²Œ μΌκ΄€λœ κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰