【问题标题】:run command in docker-compose.yml在 docker-compose.yml 中运行命令
【发布时间】:2020-06-25 08:17:09
【问题描述】:

我有 laravel 项目,必须为此创建一个 docker 容器。 我已经完成了,但是对于 MySQL,我必须运行一些命令

docker-compose exec app php artisan key:generate
docker-compose exec db bash
mysql -u root -p
Login Using password Library!23
GRANT ALL ON laravel.* TO 'root'@'%' IDENTIFIED BY '123';
FLUSH PRIVILEGES;
EXIT;
exit
docker-compose exec app php artisan migrate

在第 2 行应用程序中切换 bash,我必须退出才能运行命令 但我需要在运行 artisan migrate 之后打开 MySQL bash 登录并授予用户权限 它是我的 doke-compose.yml

version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: xxxxxxx/lumen:Library
    container_name: Library
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
    networks:
      - app-network

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: LibraryWebserver
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.22
    container_name: Librarydb
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: library
      MYSQL_ROOT_PASSWORD: Library!23
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - app-network
    volumes:
      - dbdata:/var/lib/mysql
#Docker Networks
networks:
  app-network:
    driver: bridge
#Volumes
volumes:
  dbdata:
    driver: local

还有我的 Dockerfile

FROM php:7.4-fpm

COPY composer.lock composer.json /var/www/

WORKDIR /var/www

RUN apt-get update --fix-missing && apt-get install -y  \
    build-essential \
    libssl-dev \
    zlib1g-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    zlibc \
    mariadb-client \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl \
    zip

RUN docker-php-ext-install opcache  && docker-php-ext-enable opcache

RUN apt-get clean && rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-install pdo_mysql exif pcntl
#RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install bcmath

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

EXPOSE 9000
CMD ["php-fpm"]


谁能帮帮我??? 我想在应用程序 bash 中运行 composer install

【问题讨论】:

  • 第二个控制台?
  • for exp: im in hookin>laravel 在docker-compose exec db bash 控制台转到 Docker>db
  • 为什么不写一个脚本来运行,它驻留在容器中?

标签: mysql laravel docker docker-compose


【解决方案1】:

对于第 2 - 8 步,您必须像我们的朋友所说的那样 使用 sql 命令创建引导文件并在 dockerfile 中运行它 要么 您可以在 docker-compose.yml 中创建用户并将管理员访问权限传递给用户

 db:
    image: mysql:5.7.22
    container_name: Librarydb
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: library
      MYSQL_ROOT_PASSWORD: TheRootPassword
      MYSQL_USER: root
      MYSQL_PASSWORD: PasswordForLoginAndUse
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - app-network
    volumes:
      - dbdata:/var/lib/mysql

关于使用工匠生成密钥是不必要的
应用程序认为您在一个系统中运行它是因为 docker
我更喜欢你手动运行迁移
更好

【讨论】:

    【解决方案2】:

    而不是直接(或手动)执行 MySQL 命令。您可以使用以下方法使用所有需要的数据和配置引导 MySQL 容器。

    1- 创建一个引导文件:sql-scripts.sql

    GRANT ALL ON laravel.* TO 'root'@'%' IDENTIFIED BY '123';
    FLUSH PRIVILEGES;
    

    2- 创建自定义 MySQL Docker 镜像:mysql.Dockerfile

    FROM mysql:8.0.1
    COPY ./sql-scripts.sql /docker-entrypoint-initdb.d/
    

    3- 构建 MySQL docker 镜像并在你的 docker-compose 文件中使用它。您需要在 docker-compose 进行以下更改之前。引导文件将在第一次您执行docker-compose up 时自动执行。您需要删除 MySQL 卷以使其适用于您的堆栈docker volume rm dbdata

    db:
        build:
          context: .
          dockerfile: mysql.Dockerfile
    

    【讨论】:

    • 你能给我更多帮助吗????我将脚本复制到 docker-entrypoint-initdb.d 以及如何运行它?
    • 执行docker-compose up时会自动执行。你能分享你的撰写文件吗?
    • 我添加了我的撰写文件
    • 请记住,这个脚本通常只在容器第一次启动时运行。如果您需要重新运行该脚本,则必须先删除附加的卷
    • 嗨再次为我工作```mysql> SHOW DATABASES;错误 1146 (42S02): 表 'information_schema.SCHEMATA' 不存在 ``` 如果我运行 FROM : mysql:5.7.22 它同样的错误
    猜你喜欢
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多