Терминал
COMPOSE_DOCKER_CLI_BUILD=1 COMPOSE_DOCKER_CLI_LINK=1 DOCKER_BUILDKIT=1 docker-compose up --build
Вывод
Successfully built fe4aa685d34a0cdeb29c4af824f2cfa7c11a6d036ee85ee19bd7615a518d80a9
Building php
[+] Building 0.8s (4/4) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 38B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 35B 0.0s
=> resolve image config for docker.io/docker/dockerfile:experimental 0.4s
=> CACHED docker-image://docker.io/docker/dockerfile:experimental@sha256:600e5c62eedff338b3f7a0850beb7c05866e0ef27b2d2e8c02aa468e78496ff5 0.0s
failed to solve with frontend dockerfile.v0: failed to solve with frontend gateway.v0: rpc error: code = Unknown desc = failed to create LLB definition:
dockerfile parse error line 63: Unknown flag: link
Traceback (most recent call last):
File "/usr/bin/docker-compose", line 11, in <module>
load_entry_point('docker-compose==1.25.0', 'console_scripts', 'docker-compose')()
File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 72, in main
command()
Докерфайл
COPY --link docker/php/conf.d/app.ini $PHP_INI_DIR/conf.d/ # line 63
Сервис/контейнеры докеров доступны по адресу: https://api-platform.com/docs/distribution/
По правде говоря. Я нигде не вижу PHP_INI_DIR определенного. Этого нет ни в моем .env файле, ни в docker-compose.yml, docker-compose.override.yml или docker-compose.prod.yml
Попробуйте без переменной и посмотрите, как это работает.
это то, что я сейчас пытаюсь - без переменной
Идеально. Обновляйте здесь, когда у вас есть новости.
такая же ошибка. Затем я снова пытаюсь установить переменную в .env - PHP_INI_DIR=/etc/php/8.1/cli, та же ошибка. Между тем, в документах ничего по этому поводу нет.
Хам. Вы пытаетесь связать файл с каталогом?
Как и во всех командах Dockerfile, мы просто копируем содержимое нашего локального хоста в контейнер, т.е. COPY path/to/some-local-file.sh /path/to/container
Ага. Но в этом примере у вас нет опции --link.
Опуская --link, мы можем добиться тех же результатов: docs.docker.com/engine/reference/builder
Я решаю эту проблему, экспортируя переменную оболочки, чтобы включить режим BuildKit. экспортировать DOCKER_BUILDKIT=1





У нас больше успеха при удалении флагов --link внутри Dockerfile.
#syntax=docker/dockerfile:experimental
# Adapted from https://github.com/dunglas/symfony-docker
# Prod image
FROM php:8.1-fpm-alpine AS app_php
ENV APP_ENV=prod
WORKDIR /srv/app
# persistent / runtime deps
RUN apk add --no-cache \
acl \
fcgi \
file \
gettext \
git \
;
RUN set -eux; \
apk add --no-cache --virtual .build-deps \
$PHPIZE_DEPS \
icu-data-full \
icu-dev \
libzip-dev \
zlib-dev \
; \
\
docker-php-ext-configure zip; \
docker-php-ext-install -j$(nproc) \
intl \
zip \
; \
pecl install \
apcu \
; \
pecl clear-cache; \
docker-php-ext-enable \
apcu \
opcache \
; \
\
runDeps = "$( \
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
| tr ',' '\n' \
| sort -u \
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
)"; \
apk add --no-cache --virtual .app-phpexts-rundeps $runDeps; \
\
apk del .build-deps
###> recipes ###
###> doctrine/doctrine-bundle ###
RUN apk add --virtual .pgsql-deps postgresql-dev; \
docker-php-ext-install -j$(nproc) pdo_pgsql; \
apk add --no-cache --virtual .pgsql-rundeps so:libpq.so.5; \
apk del .pgsql-deps
###< doctrine/doctrine-bundle ###
###< recipes ###
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY docker/php/conf.d/app.ini $PHP_INI_DIR/conf.d/
COPY docker/php/conf.d/app.prod.ini $PHP_INI_DIR/conf.d/
COPY docker/php/php-fpm.d/zz-docker.conf /usr/local/etc/php-fpm.d/zz-docker.conf
RUN mkdir -p /var/run/php
COPY docker/php/docker-healthcheck.sh /usr/local/bin/docker-healthcheck
RUN chmod +x /usr/local/bin/docker-healthcheck
HEALTHCHECK --interval=10s --timeout=3s --retries=3 CMD ["docker-healthcheck"]
COPY docker/php/docker-entrypoint.sh /usr/local/bin/docker-entrypoint
RUN chmod +x /usr/local/bin/docker-entrypoint
ENTRYPOINT ["docker-entrypoint"]
CMD ["php-fpm"]
# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser
ENV COMPOSER_ALLOW_SUPERUSER=1
ENV PATH = "${PATH}:/root/.composer/vendor/bin"
COPY --from=composer/composer:2-bin /composer /usr/bin/composer
# prevent the reinstallation of vendors at every changes in the source code
COPY composer.* symfony.* ./
RUN set -eux; \
composer install --prefer-dist --no-dev --no-autoloader --no-scripts --no-progress; \
composer clear-cache
# copy sources
COPY . .
RUN rm -Rf docker/
RUN set -eux; \
mkdir -p var/cache var/log; \
composer dump-autoload --classmap-authoritative --no-dev; \
composer dump-env prod; \
composer run-script --no-dev post-install-cmd; \
chmod +x bin/console; sync
# Dev image
FROM app_php AS app_php_dev
ENV APP_ENV=dev XDEBUG_MODE=off
VOLUME /srv/app/var/
RUN rm $PHP_INI_DIR/conf.d/app.prod.ini; \
mv "$PHP_INI_DIR/php.ini" "$PHP_INI_DIR/php.ini-production"; \
mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
COPY docker/php/conf.d/app.dev.ini $PHP_INI_DIR/conf.d/
RUN set -eux; \
apk add --no-cache --virtual .build-deps $PHPIZE_DEPS; \
pecl install xdebug; \
docker-php-ext-enable xdebug; \
apk del .build-deps
RUN rm -f .env.local.php
# Build Caddy with the Mercure and Vulcain modules
FROM caddy:2-builder-alpine AS app_caddy_builder
RUN xcaddy build \
--with github.com/dunglas/mercure \
--with github.com/dunglas/mercure/caddy \
--with github.com/dunglas/vulcain \
--with github.com/dunglas/vulcain/caddy
# Caddy image
FROM caddy:2-alpine AS app_caddy
WORKDIR /srv/app
COPY --from=app_caddy_builder /usr/bin/caddy /usr/bin/caddy
COPY --from=app_php /srv/app/public public/
COPY docker/caddy/Caddyfile /etc/caddy/Caddyfile
Исходные файлы: https://github.com/api-platform/api-platform/generate
Контейнеры теперь успешно вращаются, но все еще не полностью работают в браузере: -
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0bd06fe7289 fluffy-octo-broccoli_caddy "caddy run --config …" 6 seconds ago Up 4 seconds 2019/tcp, 0.0.0.0:8123->80/tcp, :::8123->80/tcp, 0.0.0.0:444->443/tcp, 0.0.0.0:444->443/udp, :::444->443/tcp, :::444->443/udp
что более интересно, URL-адрес перенаправляет с http://localhost:8123/api на https://localhost/api
Пожалуйста, ознакомьтесь с решением, предложенным @BryceLarkin в stackoverflow.com/a/74925550/1422404 относительно синтаксиса dockerfile.
Когда у вас есть рана на руке, лечите рану вместо того, чтобы резать руку
У меня такая же проблема при создании образа с последним шаблоном https://github.com/dunglas/symfony-docker в моем конвейере GitLab CI. Странно то, что на моем локальном ноутбуке с Ubuntu 22.04 и последним движком Docker все работает нормально.
В моем пайплайне GitLab оказалось, что проблема в том, что и API-платформа, и шаблон symfony-docker используют Dockerfile:1.4, который содержит --link параметры для COPY команды.
Есть два (2) способа решить эту проблему:
Удалите все --link команды из Dockerfile. Он создаст изображение с обычным COPY, и ваше изображение будет работать нормально.
Если вы все еще хотите использовать изображение по умолчанию с link, вам нужно добавить DOCKER_BUILDKIT=1 в качестве переменной среды. Я использую этот метод и обновляю сервис docker:dind до docker:20.10.21-dind, и теперь мой конвейер работает хорошо.
Вам нужно добавить # syntax=docker/dockerfile:1.4 в начало вашего Dockerfile, чтобы включить флаг --link.
Источник: https://www.docker.com/blog/image-rebase-and-improved-remote-cache-support-in-new-buildkit/
У моего такая же ошибка. Просто удалю
Вы включаете buildkit?
Вам нужно добавить строку ниже в верхнюю часть вашего Dockerfile.
# syntax=docker/dockerfile:1.4
Согласно официальному документу, вам необходимо включить режим BuildKit https://hub.docker.com/r/docker/dockerfile.
Если вы используете Docker v18.09 или более позднюю версию, режим BuildKit можно включить, установив export DOCKER_BUILDKIT=1 на вашем терминале.
Чтобы использовать флаг --link, установите версию Dockerfile не ниже 1.4.
# syntax=docker/dockerfile:1.4
Кажется, все в порядке. Я думал, что некоторые из файлов, которые будут использоваться по ссылке, не могут существовать, когда работает
COPY. Вы можете проверить содержимоеPHP_INI_DIR?