переменная окружения docker compose не устанавливает переменную внутри Dockerfile - PullRequest
1 голос
/ 21 апреля 2019

Я создаю свое приложение для локальной разработки, используя docker-compose.yaml, используя два Dockerfiles - одно для приложения (WordPress), а другое для nginx. Поскольку это специальное приложение, построенное с использованием конвейера Jenkins, я не могу изменить файлы Docker, но я хотел бы иметь возможность использовать ту же среду для локального тестирования, что и на промежуточных и рабочих серверах.

Часть php работает, но nginx не работает. Dockerfile для nginx выглядит так:

FROM nginx:latest

COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
COPY ./config/nginx.conf /opt/nginx.conf
COPY ./config/nginx.conf.prd /opt/nginx.conf.prd

COPY --from=DOCKER_IMAGE_NAME_PHP /var/www/html/ /var/www/html/

CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]

Сбой DOCKER_IMAGE_NAME_PHP с

ОШИБКА: не удалось создать службу 'nginx': недопустимо из значения флага DOCKER_IMAGE_NAME_PHP: недопустимый формат ссылки: имя репозитория должно быть в нижнем регистре

В моем docker-compose.yaml для части nginx у меня есть

nginx:
    build:
      context: .
      dockerfile: Dockerfile.static
    container_name: web-service
    working_dir: /var/www
    volumes:
      - .:/var/www
    environment:
      - "DOCKER_IMAGE_NAME_PHP=app-admin"
      - "DOCKER_IMAGE_NAME_NGINX=web-service"
    depends_on:
      - app
    ports:
      - 8090:80

Я думал, что установки environment в файле compose будет достаточно, и что это будет использовано (app-admin - это container_name части php с WordPress).

В моих конвейерных сценариях Jenkins эти имена используются для создания приложения и статических изображений вручную (с использованием docker build -t DOCKER_IMAGE_NAME_PHP -f Dockerfile.php), а затем имена устанавливаются на env, как

echo -e "DOCKER_IMAGE_NAME_PHP=$DOCKER_IMAGE_NAME_PHP" >>env

EDIT

Как и предложенный ответ, я пытался добавить args под build key

build:
  context: .
  dockerfile: Dockerfile.static
  args:
    - "DOCKER_IMAGE_NAME_PHP=app-admin"

Тогда в моем Dockerfile я добавил

FROM nginx:latest

COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
COPY ./config/nginx.conf /opt/nginx.conf
COPY ./config/nginx.conf.prd /opt/nginx.conf.prd

ARG DOCKER_IMAGE_NAME_PHP

COPY --from=$DOCKER_IMAGE_NAME_PHP /var/www/html/ /var/www/html/

CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]

Но я все еще получаю ошибку. Я пробовал с ${DOCKER_IMAGE_NAME_PHP}, но это не помогает.

Странно то, что при добавлении RUN echo $DOCKER_IMAGE_NAME_PHP, когда я запускаю это, я вижу

Step 6/8 : RUN echo $DOCKER_IMAGE_NAME_PHP
 ---> Running in 0801fcd5b77f
app-admin

Но это не распознается в команде COPY. Как получилось?

РЕДАКТИРОВАТЬ 2

Оказывается, я не могу сделать это:

https://github.com/moby/moby/issues/34482

Поскольку --from ожидает имя образа (которое я пытаюсь передать ему из ранее созданной службы, но в моем случае оно динамическое). Это работает в Jenkins, так как я делаю команду docker build, а переменные доступны в скрипте bash ...

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

COPY --from не поддерживает переменные, но FROM поддерживает.

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

ARG DOCKER_IMAGE_NAME_PHP=php:7.3
FROM ${DOCKER_IMAGE_NAME_PHP} as php-image
FROM nginx:latest

COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
COPY ./config/nginx.conf /opt/nginx.conf
COPY ./config/nginx.conf.prd /opt/nginx.conf.prd

COPY --from=php-image /var/www/html/ /var/www/html/

CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]

почти такой же пример находится в документах

0 голосов
/ 21 апреля 2019

Для этого вы должны использовать ARG в Dockerfile.

https://docs.docker.com/engine/reference/builder/#arg

environment в docker-compose.yml недоступен при сборке.

https://docs.docker.com/compose/compose-file/#environment

Вы также можете использовать arg в docker-compose.yml:

https://docs.docker.com/compose/compose-file/#args

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...