Создать файл конфигурации при запуске контейнера Docker с Compose - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть следующее Dockerfile

FROM node:10.8.0-alpine as builder

# Set working directory
RUN mkdir /usr/src
RUN mkdir /usr/src/app
WORKDIR /usr/src/app

# Add /usr/src/app/node_modules/.bin to $PATH
ENV PATH /usr/src/app/node_modules/.bin:$PATH

# Get build arguments coming from .env file
ARG API_URL
ENV API_URL "$API_URL"

# Create config file from environment variables
RUN echo "API_URL = $API_URL" > ./app.cfg

# Install and cache app dependencies
COPY package.json /usr/src/app/package.json
RUN npm install
RUN npm install react-scripts@1.1.1 -g
COPY . /usr/src/app
RUN npm run build

# Production environment
FROM nginx:1.15.2-alpine
COPY --from=builder /usr/src/app/build /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]

И я использую следующий docker-compose.yml файл для создания своего образа Docker

version: '3'
services:

  app:
    container_name: data-quality-app
    restart: always
    image: data-quality-app
    build:
      context: ./app
      dockerfile: Dockerfile
      args:
        - API_URL=${API_URL}
    env_file:
      - ./.env
    ports:
      - 80:80
    networks:
      - default

networks:
  default:
    external:
      name: data-quality-network

volumes:
  data-quality-db-volume:
    external: true

Обратите внимание, что файл .env содержит переменную среды API_URL=http://0.0.0.0:5433/graphql

Все это работает довольно хорошо, но когда я запускаю свой контейнер с Docker Compose:

$ docker-compose up app

Я хотел бы перезаписать файл app.cfg в контейнере, чтобы заменить значение API_URL его текущим значением в файле .env.

Я попытался добавить следующее ENTRYPOINT в Dockerfile, но это не сработало:

[...]
# Create config file to from environment variables
RUN echo "API_URL = $API_URL" > ./app.cfg
ENTRYPOINT echo "API_URL = $API_URL" > ./app.cfg
[...]

Чего мне не хватает?

1 Ответ

0 голосов
/ 18 сентября 2018

Вы должны написать сценарий точки входа, который выполняет необходимую настройку, а затем запускает команду, переданную в контейнер.

entrypoint.sh * * 1004

#!/bin/sh
if [ -n "$API_URL" ]; then
  echo "API_URL = $API_URL" > app.cfg
fi
exec "$@"

Dockerfile (финальная стадия):

FROM nginx:1.15.2-alpine
COPY entrypoint.sh /
COPY --from=builder /usr/src/app/build /usr/share/nginx/html
ENTRYPOINT ["/entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

Вы можете отладить это, запустив что-то вроде

docker build -t mynginx .
docker run --rm -it -e API_URL=http://test mynginx sh

, который будет запускать скрипт точки входа, передавая ему "sh" в качестве команды; это настроит файл app.cfg, а затем запустит отладочную оболочку (а не nginx).

...