Как создать пользователя и базу данных с помощью docker image

#mysql #docker #docker-compose #dockerfile

#mysql #docker #docker-compose #dockerfile

Вопрос:

Я изучаю docker и в основном пытаюсь создать образ docker mysql с базой данных и пользователем.

Я просмотрел документацию mysql docker, и в ней говорится, что:

 When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /docker-entrypoint-initdb.d
 

Итак, я создал следующий файл dockerFile:

     FROM mysql/mysql-server:8.0.22 
    
    ENV TZ Asia/Muscat
    
    COPY mysql-init.sh /docker-entrypoint-initdb.d/
 

The mysql-init.sh определяется следующим образом:

 #!/bin/bash

set -e
set -u

echo "Creating database..."

psql -v ON_ERROR_STOP=1 --username "$MYSQL_USER" <<-EOSQL
    CREATE USER test PASSWORD '$DB_TEST_PWD';
    CREATE DATABASE test;
    GRANT ALL PRIVILEGES ON DATABASE test TO test;
EOSQL
 

Когда я создал изображение, журнал показан ниже, поскольку изображение создано успешно:

введите описание изображения здесь

Затем я создал файл docker-compose для запуска образа mysql следующим образом:

 version: '3.5'

services:
 db:
    image: mysqlcustom
    restart: always
    environment:
      MYSQL_DATABASE: 'test'
      # So you don't have to use root, but you can if you like
      MYSQL_USER: 'user'
      # You can use whatever password you like
      MYSQL_PASSWORD: 'password'
      # Password for root access
      MYSQL_ROOT_PASSWORD: 'password'
      DB_TEST_PWD: 'password'
    ports:
      # <Port exposed> : < MySQL Port running inside container>
      - '3306:3306'
    expose:
      # Opens port 3306 on the container
      - '3306'
      # Where our data will be persisted
    volumes:
      - my-db:/var/lib/mysql
# Names our volume
volumes:
  my-db:
 

Но я получаю следующую ошибку при выполнении docker-compose up:

 PS D:ProjectsmysqldockerCompose> docker-compose up
Creating dockercompose_db_1 ... done
Attaching to dockercompose_db_1
db_1  | [Entrypoint] MySQL Docker Image 8.0.22-1.1.18
db_1  | [Entrypoint] Initializing database
db_1  | 2021-01-06T19:33:44.321419Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.22) initializing of server in progress as process 20
db_1  | 2021-01-06T19:33:44.325833Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
db_1  | 2021-01-06T19:33:45.026268Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
db_1  | 2021-01-06T19:33:46.309559Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
db_1  | [Entrypoint] Database initialized
db_1  | 2021-01-06T19:33:50.034016Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.22) starting as process 63
db_1  | 2021-01-06T19:33:50.047504Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
db_1  | 2021-01-06T19:33:50.203569Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
db_1  | 2021-01-06T19:33:50.294241Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
db_1  | 2021-01-06T19:33:50.388271Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
db_1  | 2021-01-06T19:33:50.388422Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
db_1  | 2021-01-06T19:33:50.405225Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.22'  socket: '/var/lib/mysql/mysql.sock'  port: 0  MySQL Community Server - GPL.
db_1  | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
db_1  | Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
db_1  | Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
db_1  | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
db_1  | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
db_1  |
db_1  | [Entrypoint] running /docker-entrypoint-initdb.d/mysql-init.sh
db_1  | /docker-entrypoint-initdb.d/mysql-init.sh: line 2: 

Есть идеи, что я делаю не так, пожалуйста?
Заранее спасибо за любую помощь


Комментарии:

1. Похоже, вы прикрепили к своему вопросу пару больших файлов изображений в качестве выходных данных вашего контейнера. Я бы ожидал, что контейнер будет записывать журналы в текстовом формате; можете ли вы заменить изображения фактическим выводом текста из контейнеров?

2. Две непосредственные вещи, которые бросаются в глаза при взгляде на это, - это строка bash shebang (база данных может не иметь этой оболочки) и то, что вы используете psql клиент PostgreSQL в среде MySQL, отличной от MySQL. Нижние пиксели последнего изображения предполагают, что файл сценария имеет окончания строк DOS, что также может быть проблемой. Если вы просто хотите создать базу данных и пользователя, образ Docker Hub mysql имеет стандартные переменные среды для автоматической настройки.

3. большое спасибо за ответ, я прошел через docker hub mysql image, вы имеете в виду, что переменная среды может быть добавлена в mysql-init.sh чтобы создать пользователя и базу данных?

4. Поскольку в docker-compose.yml файле объявляется MYSQL_USER: user и MYSQL_DATABASE: test , этот пользователь и база данных создаются для вас; вам не нужен этот скрипт.

r': command not found
Есть идеи, что я делаю не так, пожалуйста?
Заранее спасибо за любую помощь

Комментарии:

1. Похоже, вы прикрепили к своему вопросу пару больших файлов изображений в качестве выходных данных вашего контейнера. Я бы ожидал, что контейнер будет записывать журналы в текстовом формате; можете ли вы заменить изображения фактическим выводом текста из контейнеров?

2. Две непосредственные вещи, которые бросаются в глаза при взгляде на это, — это строка bash shebang (база данных может не иметь этой оболочки) и то, что вы используете psql клиент PostgreSQL в среде MySQL, отличной от MySQL. Нижние пиксели последнего изображения предполагают, что файл сценария имеет окончания строк DOS, что также может быть проблемой. Если вы просто хотите создать базу данных и пользователя, образ Docker Hub mysql имеет стандартные переменные среды для автоматической настройки.

3. большое спасибо за ответ, я прошел через docker hub mysql image, вы имеете в виду, что переменная среды может быть добавлена в mysql-init.sh чтобы создать пользователя и базу данных?

4. Поскольку в docker-compose.yml файле объявляется MYSQL_USER: user и MYSQL_DATABASE: test , этот пользователь и база данных создаются для вас; вам не нужен этот скрипт.