SQLダンプからインポートされた2つのデータベースでdocker-compose.ymlを使用してdockerを実装する方法を見つけようとしています。
httpd:
container_name: webserver
build: ./webserver/
ports:
- 80:80
links:
- mysql
- mysql2
volumes_from:
- app
mysql:
container_name: sqlserver
image: mysql:latest
ports:
- 3306:3306
volumes:
- ./sqlserver:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: dbname1
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbpass
mysql2:
extends: mysql
container_name: sqlserver2
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: dbname2
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbpass
app:
container_name: webdata
image: php:latest
volumes:
- ../php:/var/www/html
command: "true"
上記は以下を返します:
Kronos:mybuild avanche$ ./run.sh
Creating sqlserver
Creating webdata
Creating sqlserver2
ERROR: for mysql2 driver failed programming external connectivity on endpoint sqlserver2 (6cae3dfe7997d3787a8d59a95c1b5164f7431041c1394128c14e5ae8efe647a8): Bind for 0.0.0.0:3306 failed: port is already allocated
Traceback (most recent call last):
File "<string>", line 3, in <module>
File "compose/cli/main.py", line 63, in main
AttributeError: 'ProjectError' object has no attribute 'msg'
docker-compose returned -1
基本的に、単一のdocker composeファイルでスタック設定全体を取得し、2つのデータベースを作成して、それぞれのSQLダンプをインポートしようとしています。誰か提案がありますか?
両方のデータベースコンテナを同じポート(3306
)にバインドしようとしています。これは本質的に不可能です。データベースの1つのポートマッピングを変更する必要があります。たとえば、mysql
は3306:3306
を保持し、mysql2
は3307:3306
を使用する必要があります。
これを検討する可能性のある他の人への更新として。
私はこれを解決して解決しました:
MYSQL_DATABASE: dbname
from docker-compose.ymlおよび関連するデータベース作成ステートメントをdocker-entrypoint-initdb.dに渡されるsqlファイルに直接追加します。
その段階で、SQLコマンドはルートの下で実行されるため、使用するデータベースユーザーに関連する権限を付与するステートメントも追加する必要があります。
このページの他の部分の回答では、各データベース専用のコンテナを設定していますが、単一のMySQLサーバーで複数のデータベースをホストできます。 別の質問 が必要かどうか。ただし、単一のコンテナに複数のデータベースが必要な場合は、 例はこちら です。
docker-compose.yml:
version: '3'
volumes:
db:
driver: local
services:
db:
image: mysql:5.7
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./docker/provision/mysql/init:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: local
docker/provision/mysql/init/01-databases.sql:
# create databases
CREATE DATABASE IF NOT EXISTS `primary`;
CREATE DATABASE IF NOT EXISTS `secondary`;
# create root user and grant rights
CREATE USER 'root'@'localhost' IDENTIFIED BY 'local';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
これは、 MySQL Dockerプロジェクト に エントリポイントスクリプト があり、/docker-entrypoint-initdb.d
フォルダー(存在する場合)。これは、データベースをセットアップし、そのスキーマとデータを初期化するのに役立ちます。 docker-composeでは、volumes
を使用して、その仮想フォルダーをホストシステム上のフォルダーにマップします。
version: '3'
services:
mysql1:
image: mysql:5.6.26
environment:
MYSQL_ROOT_PASSWORD: asdf
MYSQL_USER: asdf
MYSQL_Host: localhost
MYSQL_PASSWORD: asdf
MYSQL_DATABASE: asdf
ports:
- "3307:3306"
mysql2:
image: mysql:5.6.26
environment:
MYSQL_ROOT_PASSWORD: asdf
MYSQL_USER: asdf
MYSQL_Host: localhost
MYSQL_PASSWORD: asdf
MYSQL_DATABASE: asdf
ports:
- "3308:3306"
docker-compose up
の後Mysql1に接続する
mysql -h localhost -uasdf -P 3307 -pasdf asdf --protocol=tcp -D asdf
Mysql2に接続する
mysql -h localhost -uasdf -P 3308 -pasdf asdf --protocol=tcp -D asdf