Eu sunt încercarea de a crea un container cu o bază de date MySQL și adăugați o schemă a acestor date.
Actualul meu Dockerfile este:
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
COPY files/epcis_schema.sql /data/epcis_schema.sql
# Change the working directory
WORKDIR data
CMD mysql -u $MYSQL_USER -p $MYSQL_PASSWORD $MYSQL_DATABASE < epcis_schema.sql
În scopul de a crea container sunt următoarele documentația furnizată pe Docker și de a executa această comandă:
docker run --name ${CONTAINER_NAME} -e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} -e MYSQL_USER=${DB_USER} -e MYSQL_PASSWORD=${DB_USER_PASSWORD} -e MYSQL_DATABASE=${DB_NAME} -d mvpgomes/epcisdb
Dar când am execute această comandă Recipientul nu este creat și în starea Containerului este posibil pentru a vedea că CMD nu a fost executată cu succes, în fapt doar mysql
este executat comanda.
Oricum, există o modalitate de a inițializa baza de date cu schema sau am nevoie pentru a efectua aceste operațiuni manual?
Am avut aceeași problemă în cazul în care am vrut să inițializa mea MySQL Docker exemplu's schema, dar m-am întâlnit dificultăți în obținerea acest lucru după ce faci unele de Googling și următoarele altele' exemple. Aici's cum am rezolvat-o.
mysqldump -h <your_mysql_host> -u <user_name> -p --no-data <schema_name> > schema.sql
/docker-entrypoint-initdb.d
director în Docker container. A docker-entrypoint.sh dosarul va rula orice fișiere în acest director se termină cu
".sql" împotriva celor de la baza de date MySQL.Dockerfile:
FROM mysql:5.7.15
MAINTAINER me
ENV MYSQL_DATABASE=<schema_name> \
MYSQL_ROOT_PASSWORD=<password>
ADD schema.sql /docker-entrypoint-initdb.d
EXPOSE 3306
docker-compose build
docker-compose up
Datorită https://stackoverflow.com/questions/25920029/setting-up-mysql-and-importing-dump-within-dockerfile pentru spunându-mi în pe docker-entrypoint.sh și faptul că se execută atât SQL și scripturi shell!
Îmi pare rău pentru acest super-lung, dar, ai un pic de mod de a merge pentru a ajunge acolo unde vrei. Eu va spun ca in mod normal nu m't pune de stocare pentru baza de date în același container cu baza de date în sine, te-ar monta o serie de volum, astfel încât datele persistă pe docker gazdă, sau, poate, un container poate fi utilizat pentru a păstra datele (/var/lib/mysql). De asemenea, eu sunt nou la mysql, deci, acest lucru nu ar putea fi super-eficiente. Asta a spus...
Cred că ar putea fi câteva probleme aici. La Dockerfile este folosit pentru a crea o imagine. Aveți nevoie pentru a executa construi pas. La un nivel minim, de la directorul care conține Dockerfile te-ar face ceva de genul :
docker build .
La Dockerfile descrie imaginea pentru a crea. Eu nu't știu prea multe despre mysql (eu sunt un postgres fanboy), dar, am făcut o căutare în jurul interwebs pentru 'cum pot inițializa un mysql docker container'. Mai întâi am creat un director nou pentru a lucra în, am numit-o mdir, apoi am creat o directorul de fișiere pe care am depus-o epcis_schema.fișier sql care creează o bază de date și un singur tabel:
create database test;
use test;
CREATE TABLE testtab
(
id INTEGER AUTO_INCREMENT,
name TEXT,
PRIMARY KEY (id)
) COMMENT='this is my test table';
Apoi am creat un script numit init_db în directorul de fișiere:
#!/bin/bash
# Initialize MySQL database.
# ADD this file into the container via Dockerfile.
# Assuming you specify a VOLUME ["/var/lib/mysql"] or `-v /var/lib/mysql` on the `docker run` command…
# Once built, do e.g. `docker run your_image /path/to/docker-mysql-initialize.sh`
# Again, make sure MySQL is persisting data outside the container for this to have any effect.
set -e
set -x
mysql_install_db
# Start the MySQL daemon in the background.
/usr/sbin/mysqld &
mysql_pid=$!
until mysqladmin ping >/dev/null 2>&1; do
echo -n "."; sleep 0.2
done
# Permit root login without password from outside container.
mysql -e "GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '' WITH GRANT OPTION"
# create the default database from the ADDed file.
mysql < /tmp/epcis_schema.sql
# Tell the MySQL daemon to shutdown.
mysqladmin shutdown
# Wait for the MySQL daemon to exit.
wait $mysql_pid
# create a tar file with the database as it currently exists
tar czvf default_mysql.tar.gz /var/lib/mysql
# the tarfile contains the initialized state of the database.
# when the container is started, if the database is empty (/var/lib/mysql)
# then it is unpacked from default_mysql.tar.gz from
# the ENTRYPOINT /tmp/run_db script
(cele mai multe de acest script a fost luat de aici: https://gist.github.com/pda/9697520)
Aici este fișiere/run_db script-am creat:
# start db
set -e
set -x
# first, if the /var/lib/mysql directory is empty, unpack it from our predefined db
[ "$(ls -A /var/lib/mysql)" ] && echo "Running with existing database in /var/lib/mysql" || ( echo 'Populate initial db'; tar xpzvf default_mysql.tar.gz )
/usr/sbin/mysqld
În cele din urmă, Dockerfile de a le lega pe toate:
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
ADD files/run_db files/init_db files/epcis_schema.sql /tmp/
# init_db will create the default
# database from epcis_schema.sql, then
# stop mysqld, and finally copy the /var/lib/mysql directory
# to default_mysql_db.tar.gz
RUN /tmp/init_db
# run_db starts mysqld, but first it checks
# to see if the /var/lib/mysql directory is empty, if
# it is it is seeded with default_mysql_db.tar.gz before
# the mysql is fired up
ENTRYPOINT "/tmp/run_db"
Deci, am cd'ed meu mdir director (care are Dockerfile împreună cu directorul de fișiere). Apoi am rulat comanda:
docker build --no-cache .
Ar trebui să vezi astfel de rezultate:
Sending build context to Docker daemon 7.168 kB
Sending build context to Docker daemon
Step 0 : FROM mysql
---> 461d07d927e6
Step 1 : MAINTAINER (me) <email>
---> Running in 963e8de55299
---> 2fd67c825c34
Removing intermediate container 963e8de55299
Step 2 : ADD files/run_db files/init_db files/epcis_schema.sql /tmp/
---> 81871189374b
Removing intermediate container 3221afd8695a
Step 3 : RUN /tmp/init_db
---> Running in 8dbdf74b2a79
+ mysql_install_db
2015-03-19 16:40:39 12 [Note] InnoDB: Using atomics to ref count buffer pool pages
...
/var/lib/mysql/ib_logfile0
---> 885ec2f1a7d5
Removing intermediate container 8dbdf74b2a79
Step 4 : ENTRYPOINT "/tmp/run_db"
---> Running in 717ed52ba665
---> 7f6d5215fe8d
Removing intermediate container 717ed52ba665
Successfully built 7f6d5215fe8d
Acum aveți o imagine '7f6d5215fe8d'. Am putut rula această imagine:
docker run -d 7f6d5215fe8d
și imaginea începe, am vedea un exemplu de șir:
4b377ac7397ff5880bc9218abe6d7eadd49505d50efb5063d6fab796ee157bd3
Am putea apoi 'nu mai' s, și reporniți-l.
docker stop 4b377
docker start 4b377
Dacă te uiți la busteni, prima linie va conține:
docker logs 4b377
Populate initial db
var/lib/mysql/
...
Apoi, la sfârșitul busteni:
Running with existing database in /var/lib/mysql
Acestea sunt mesajele de la /tmp/run_db script, primul indică faptul că baza de date a fost despachetat de salvat (inițială) versiune, cea de-a doua indică faptul că baza de date a fost deja acolo, astfel încât copie existentă a fost folosit.
Aici este un ls-lR de structura de directoare-am descris mai sus. Rețineți că init_db și run_db sunt scripturi cu executa bit setat:
gregs-air:~ gfausak$ ls -Rl mdir
total 8
-rw-r--r-- 1 gfausak wheel 534 Mar 19 11:13 Dockerfile
drwxr-xr-x 5 gfausak staff 170 Mar 19 11:24 files
mdir/files:
total 24
-rw-r--r-- 1 gfausak staff 126 Mar 19 11:14 epcis_schema.sql
-rwxr-xr-x 1 gfausak staff 1226 Mar 19 11:16 init_db
-rwxr-xr-x 1 gfausak staff 284 Mar 19 11:23 run_db
Un alt mod de-a bazat pe o îmbinare de serveral răspunsurile aici înainte :
docker-compune fișier :
version: "3"
services:
db:
container_name: db
image: mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=mysql
- MYSQL_DATABASE=db
volumes:
- /home/user/db/mysql/data:/var/lib/mysql
- /home/user/db/mysql/init:/docker-entrypoint-initdb.d/:ro
unde /home/user
.. este un folder partajat de pe host
Și în /home/user/db/mysql/init
folder .. doar picătură un fișier sql, cu orice nume, de exemplu `init.sql conține :
CREATE DATABASE mydb;
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' IDENTIFIED BY 'mysql';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost' IDENTIFIED BY 'mysql';
USE mydb
CREATE TABLE CONTACTS (
[ ... ]
);
INSERT INTO CONTACTS VALUES ...
[ ... ]
Conform oficial mysql documentația, puteți pune mai mult de un fișier sql în docker-entrypoint-initdb.d`, acestea sunt executate în ordine alfabetică
Am'am incercat Greg's a răspunde cu succes zero, trebuie să fi făcut ceva greșit din baza mea de date nu a avut date după ce toate pașii de mai jos: am fost folosind MariaDB's cele mai recente imagini, doar în cazul în.
Atunci am decis să citesc entrypoint oficial MariaDB imageși le-au folosit pentru a genera un simplu docker-compune fișier:
database:
image: mariadb
ports:
- 3306:3306
expose:
- 3306
volumes:
- ./docker/mariadb/data:/var/lib/mysql:rw
- ./database/schema.sql:/docker-entrypoint-initdb.d/schema.sql:ro
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
Acum am'm capabil să persiste datele mele ȘI de a genera o bază de date cu propria schemă!
Celălalt mod simplu, utilizați docker-compune cu următoarele linii:
mysql:
from: mysql:5.7
volumes:
- ./database:/tmp/database
command: mysqld --init-file="/tmp/database/install_db.sql"
Pune-ti schema de baze de date în ./baze de date/install_db.sql. De fiecare dată când a construi container, install_db.sql va fi executat.
După Aug. 4, 2015, dacă sunteți folosind oficial mysql Docker imagine, puteți ADĂUGA doar/COPIA un fișier în /docker-entrypoint-initdb.d/ director și va rula cu recipientul este inițializat. Vezi github: https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225 dacă doriți să-l pună în aplicare pe alt recipient imagini
Cea mai simplă soluție este de a utiliza tutum/mysql
docker pull tutum/mysql:5.5
docker run -d -p 3306:3306 -v /tmp:/tmp -e STARTUP_SQL="/tmp/to_be_imported.mysql" tutum/mysql:5.5
Ia de mai sus CONTAINER_ID și apoi executa comanda `docker busteni pentru a vedea parola generata de informații.
docker logs #<CONTAINER_ID>
Pentru cei care nu doresc pentru a crea un entrypoint script ca mine, de fapt, ai putea începe mysqld la build-time și apoi executa comenzi mysql în Dockerfile astfel:
RUN mysqld_safe & until mysqladmin ping; do sleep 1; done && \
mysql -uroot -e "CREATE DATABASE somedb;" && \
mysql -uroot -e "CREATE USER 'someuser'@'localhost' IDENTIFIED BY 'somepassword';" && \
mysql -uroot -e "GRANT ALL PRIVILEGES ON somedb.* TO 'someuser'@'localhost';"
Cheia aici este de a trimite mysqld_safe de fundal cu un singur `& semn.
Mai jos este Dockerfile am folosit cu succes, pentru a instala xampp, de a crea un MariaDB cu schema și pre-populate cu informații folosite pe un server local(usrs,poze comenzi,etc.)
FROM ubuntu:14.04
COPY Ecommerce.sql /root
RUN apt-get update \
&& apt-get install wget -yq \
&& apt-get install nano \
&& wget https://www.apachefriends.org/xampp-files/7.1.11/xampp-linux-x64-7.1.11-0-installer.run \
&& mv xampp-linux-x64-7.1.11-0-installer.run /opt/ \
&& cd /opt/ \
&& chmod +x xampp-linux-x64-7.1.11-0-installer.run \
&& printf 'y\n\y\n\r\n\y\n\r\n' | ./xampp-linux-x64-7.1.11-0-installer.run \
&& cd /opt/lampp/bin \
&& /opt/lampp/lampp start \
&& sleep 5s \
&& ./mysql -uroot -e "CREATE DATABASE Ecommerce" \
&& ./mysql -uroot -D Ecommerce < /root/Ecommerce.sql \
&& cd / \
&& /opt/lampp/lampp reload \
&& mkdir opt/lampp/htdocs/Ecommerce
COPY /Ecommerce /opt/lampp/htdocs/Ecommerce
EXPOSE 80
După a lupta un pic cu asta, să ia o privire la Dockerfile folosind numele volume (db-date).
L's important să declare un plus la partea finală, unde am menționat că volumul este [extern]
Toate mare a lucrat în acest fel!
version: "3"
services:
database:
image: mysql:5.7
container_name: mysql
ports:
- "3306:3306"
volumes:
- db-data:/docker-entrypoint-initdb.d
environment:
- MYSQL_DATABASE=sample
- MYSQL_ROOT_PASSWORD=root
volumes:
db-data:
external: true