Composer 安装在 dockerfile 中,而不是在入口点中

Composer install in a dockerfile not in entrypoint

提问人:Julien Gidel 提问时间:11/9/2023 最后编辑:Julien Gidel 更新时间:11/10/2023 访问量:65

问:

作为上下文,我正在尝试使用 php (fpm)、nginx 和 mysql 构建一个 symfony 应用程序的映像。

我在尝试在 dockerfile 而不是入口点中运行 composer install 时遇到了一些麻烦。

当我从容器本身执行此操作时,composer 安装可以完美运行,但是当我从 dockerfile 尝试时,我有两种类型的错误。

例如:

Failed to download symfony/twig-bridge from dist: curl error 60 while downloading https://api.github.com/repos/symfony/twig-bridge/zipball/67a33c71062d7d931fe9a8cb7be79cca986a6c09: SSL certificate problem: self signed certificate in certificate chain

fatal: unable to access 'https://github.com/symfony/web-link.git/': serve
161.6   r certificate verification failed. CAfile: none CRLfile: none

我正在使用命令运行所有内容。 我只是尝试了我在谷歌上找到的所有东西,但没有任何效果。docker compose build --no-cache

这是我的docker-compose.yml

version: '3.8'

services:
  database:
    image: mysql:${MYSQL_VERSION}
    container_name: ${MYSQL_HOST}
    environment:
      MYSQL_ROOT_USER: ${MYSQL_ROOT_USER}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_VERSION: ${MYSQL_VERSION}
    command: ["--default-authentication-plugin=mysql_native_password"]
    ports:
      - ${MYSQL_PORT}:3306
    networks:
      - symfony_app
    volumes:
      - app_mysql_data:/var/lib/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/my.cnf

  php:
    container_name: app-php
    build:
      context: ./
      dockerfile: ./docker/php/Dockerfile
      target: php_local
      args:
        TIMEZONE: ${TIMEZONE}
        USER_PHP: ${USER_PHP}
        USER_ID: ${USER_ID}
        USER_GROUP_PHP: ${USER_GROUP_PHP}
    volumes:
      - ./:/var/www/symfony:cached
      - /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt
      - symfony_app_var:/var/www/symfony/var
      - symfony_app_vendor:/var/www/symfony/vendor
    networks:
      - symfony_app
    depends_on:
      - database

  serveur:
    container_name: app-serveur
    build:
      context: ./docker/nginx
    volumes:
      - ./:/var/www/symfony:cached
      - symfony_app_var:/var/www/symfony/var
      - symfony_app_vendor:/var/www/symfony/vendor
      - /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt
    ports:
      - "8700:80"
    networks:
      - symfony_app
    env_file:
      - ./docker/nginx/.env.nginx.local
    depends_on:
      - php

volumes:
  symfony_app_var:
  symfony_app_vendor:
  app_mysql_data:

networks:
  symfony_app:

这是我的php dockerfile

#syntax=docker/dockerfile:1.4

#Image pour build en environnement local
FROM php:8.2-fpm-buster as php_base

ARG TIMEZONE
ARG USER_PHP
ARG USER_ID
ARG USER_GROUP_PHP

ENV APP_ENV=dev
WORKDIR /var/www/symfony

RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
COPY --link ./docker/php/php.ini $PHP_INI_DIR/conf.d/docker-php-config.ini

# General installation
RUN apt-get update && apt-get install -y \
    ca-certificates \
    gnupg \
    g++ \
    procps \
    openssl \
    git \
    unzip \
    zlib1g-dev \
    libzip-dev \
    libfreetype6-dev \
    libpng-dev \
    libjpeg-dev \
    libicu-dev  \
    libonig-dev \
    libxslt1-dev \
    acl \
    && echo 'alias sf="php bin/console"' >> ~/.bashrc

RUN docker-php-ext-configure gd --with-jpeg --with-freetype

RUN docker-php-ext-install \
    pdo pdo_mysql zip xsl gd intl opcache exif mbstring

# Set timezone
RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > /etc/timezone \
    && printf '[PHP]\ndate.timezone = "%s"\n', ${TIMEZONE} > /usr/local/etc/php/conf.d/tzone.ini \
    && "date"

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# exec entrypoint
COPY docker/php/docker-entrypoint.sh /usr/local/bin/docker-app-entrypoint
RUN chmod +x /usr/local/bin/docker-app-entrypoint

#Prepare composer installation
COPY --link composer.* symfony.* ./

# Add a non-root user to run the application
RUN groupadd -g ${USER_ID} ${USER_GROUP_PHP} \
    && useradd -u ${USER_ID} -g ${USER_GROUP_PHP} -s /bin/bash -m -d /home/${USER_PHP} ${USER_PHP}

# Default directories + non root user rights
RUN mkdir -p var/cache var/logs var/sessions \
        # Fixes permissions issues in non-dev mode
    && chown -R ${USER_PHP} . var/cache var/logs var/sessions

ENTRYPOINT ["docker-app-entrypoint"]

CMD ["php-fpm"]

# basic image
FROM php_base as php_local

ENV APP_ENV=dev XDEBUG_MODE=off

USER ${USER_PHP}

我真的需要一些帮助,因为我真的在这个错误上挣扎......而且,我真的不明白证书在验证中是如何工作的。

编辑:我的Dockerfile的最后一次更新,不起作用

#syntax=docker/dockerfile:1.4

FROM php:8.2-fpm-buster as php_base

ARG TIMEZONE
ARG USER_PHP
ARG USER_ID
ARG USER_GROUP_PHP

ENV APP_ENV=dev
WORKDIR /var/www/symfony

RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
COPY --link ./docker/php/php.ini $PHP_INI_DIR/conf.d/docker-php-config.ini

RUN apt-get update && apt-get install -y \
    ca-certificates \
    gnupg \
    g++ \
    procps \
    openssl \
    git \
    unzip \
    zlib1g-dev \
    libzip-dev \
    libfreetype6-dev \
    libpng-dev \
    libjpeg-dev \
    libicu-dev  \
    libonig-dev \
    libxslt1-dev \
    acl \
    && echo 'alias sf="php bin/console"' >> ~/.bashrc

RUN docker-php-ext-configure gd --with-jpeg --with-freetype

RUN docker-php-ext-install \
    pdo pdo_mysql zip xsl gd intl opcache exif mbstring

COPY --link ./docker/php/cacert.pem /usr/local/share/ca-certificates/cacert.crt
RUN chmod 644 /usr/local/share/ca-certificates/cacert.crt && update-ca-certificates

# Set timezone
RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > /etc/timezone \
    && printf '[PHP]\ndate.timezone = "%s"\n', ${TIMEZONE} > /usr/local/etc/php/conf.d/tzone.ini \
    && "date"

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# exec entrypoint
COPY docker/php/docker-entrypoint.sh /usr/local/bin/docker-app-entrypoint
RUN chmod +x /usr/local/bin/docker-app-entrypoint

#Prepare composer installation
COPY --link composer.* symfony.* ./

# Add a non-root user to run the application
RUN groupadd -g ${USER_ID} ${USER_GROUP_PHP} \
    && useradd -u ${USER_ID} -g ${USER_GROUP_PHP} -s /bin/bash -m -d /home/${USER_PHP} ${USER_PHP}

# Default directories + non root user rights
RUN mkdir -p var/cache var/logs var/sessions \
        # Fixes permissions issues in non-dev mode
    && chown -R ${USER_PHP} . var/cache var/logs var/sessions

ENTRYPOINT ["docker-app-entrypoint"]

CMD ["php-fpm"]

#Image pour build en environnement local
FROM php_base as php_local

ENV APP_ENV=dev XDEBUG_MODE=off

RUN composer install --prefer-dist --no-interaction

USER ${USER_PHP}
php docker symfony curl composer-php

评论

0赞 Adi 11/9/2023
哦,我看到您确实正在安装,但是您将它们复制到dockerfile的什么位置?这就是为什么你的坐骑不能成卷地获得它们的原因ca-certificates
0赞 Adi 11/9/2023
在 Dockerfile 中试用COPY /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
0赞 Julien Gidel 11/9/2023
我想我已经尝试过了,Docker 告诉我 /etc/ssl/certs/ca-certificates.crt 不存在
0赞 Adi 11/9/2023
哦,你能通过 ssh 进入 docker 并检查是否安装正确吗?还有它在哪里安装的?ca-certificates
0赞 Julien Gidel 11/10/2023
我今晚试过这个,并且安装了ca-certificates...我编辑了我的第一篇文章,以添加我上一个版本的样子。我尝试自己添加cacert.pem并更新ca证书,不起作用...

答:

-1赞 Paul Allsopp 11/9/2023 #1

如果有自签名证书,那就是 cUrl 的问题。只需将 --insecure 添加到您的 cUrl 命令中,告诉它忽略证书并允许未经验证的请求。

评论

0赞 Julien Gidel 11/9/2023
我使用的是作曲家,所以我让他管理自己的通话。