Saya mencoba untuk membuat sebuah wadah dengan database MySQL dan menambahkan schema untuk database ini.
Saya saat ini Dockerfile adalah:
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
Dalam rangka untuk membuat wadah saya berikut dokumentasi yang disediakan pada Docker dan mengeksekusi perintah ini:
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
Tapi ketika saya jalankan perintah ini Wadah yang tidak diciptakan dan dalam Wadah status itu adalah mungkin untuk melihat bahwa CMD itu tidak berhasil dilaksanakan, pada kenyataannya hanya mysql
perintah dijalankan.
Lagi pula, apakah ada cara untuk menginisialisasi database dengan skema atau apakah saya perlu melakukan operasi ini secara manual?
Aku punya masalah yang sama di mana saya ingin menginisialisasi MySQL saya Docker contoh's skema, tapi aku berlari ke dalam kesulitan mendapatkan kerja ini setelah melakukan Googling dan mengikuti orang lain' contoh-contoh. Berikut ini's bagaimana saya soal itu.
mysqldump -h <your_mysql_host> -u <user_name> -p --no-data <schema_name> > schema.sql
/docker-entrypoint-initdb.d
direktori dalam kontainer Docker. The docker-entrypoint.sh
file yang akan menjalankan file dalam direktori ini berakhir dengan ".sql"
terhadap database 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
Terima kasih untuk https://stackoverflow.com/questions/25920029/setting-up-mysql-and-importing-dump-within-dockerfile untuk clueing saya di atas docker-entrypoint.sh dan fakta bahwa hal itu berjalan baik dan SQL shell script!
Saya minta maaf untuk ini super panjang jawabannya, namun, anda memiliki sedikit cara untuk pergi untuk mendapatkan di mana anda ingin. Saya akan mengatakan bahwa biasanya anda tidak't menempatkan bagasi untuk database dalam wadah yang sama sebagai database itu sendiri, anda akan me-mount sebuah host volume sehingga data yang berlanjut pada docker tuan rumah, atau mungkin sebuah wadah yang bisa digunakan untuk menyimpan data (/var/lib/mysql). Juga, saya baru ke mysql, jadi ini mungkin tidak menjadi super efisien. Yang mengatakan...
Saya pikir mungkin ada beberapa masalah di sini. Yang Dockerfile digunakan untuk membuat gambar. Anda perlu untuk menjalankan langkah membangun. Minimal, dari direktori yang berisi Dockerfile anda akan melakukan sesuatu seperti :
docker build .
Yang Dockerfile menggambarkan gambar untuk membuat. Saya don't tahu banyak tentang mysql (saya postgres fanboy), tapi, saya melakukan pencarian di sekitar interwebs untuk 'bagaimana cara menginisialisasi mysql docker container'. Pertama saya membuat sebuah direktori baru untuk bekerja, saya menyebutnya mdir, maka saya membuat sebuah file direktori yang saya setor epcis_schema.file sql yang menciptakan sebuah database dan sebuah tabel tunggal:
create database test;
use test;
CREATE TABLE testtab
(
id INTEGER AUTO_INCREMENT,
name TEXT,
PRIMARY KEY (id)
) COMMENT='this is my test table';
Kemudian saya membuat sebuah script yang disebut init_db di file directory:
#!/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
(kebanyakan dari script ini diangkat dari berikut ini: https://gist.github.com/pda/9697520)
Berikut ini adalah file/run_db script yang saya buat:
# 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
Akhirnya, Dockerfile untuk mengikat mereka semua:
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"
Jadi, saya cd'ed untuk saya mdir direktori (yang memiliki Dockerfile bersama dengan file directory). Saya kemudian jalankan perintah:
docker build --no-cache .
Anda akan melihat output seperti ini:
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
Sekarang anda memiliki gambar '7f6d5215fe8d'. Saya bisa menjalankan gambar ini:
docker run -d 7f6d5215fe8d
dan gambar dimulai, aku melihat sebuah contoh string:
4b377ac7397ff5880bc9218abe6d7eadd49505d50efb5063d6fab796ee157bd3
Saya kemudian bisa 'berhenti', dan restart.
docker stop 4b377
docker start 4b377
Jika anda melihat log, baris pertama akan berisi:
docker logs 4b377
Populate initial db
var/lib/mysql/
...
Kemudian, pada akhir log:
Running with existing database in /var/lib/mysql
Ini adalah pesan dari /tmp/run_db script, yang pertama menunjukkan bahwa database telah dibongkar dari yang disimpan (awal) versi, yang kedua menunjukkan bahwa database sudah ada di sana, sehingga ada copy digunakan.
Berikut adalah ls -lR dari struktur direktori yang saya jelaskan di atas. Perhatikan bahwa init_db dan run_db adalah scripts dengan mengeksekusi bit set:
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
Cara lain berdasarkan gabungan dari beberapa tanggapan di sini sebelum :
docker-menyusun file :
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
di mana /home/user
.. adalah folder bersama pada host
Dan di /home/user/db/mysql/init
folder .. hanya drop satu sql file, dengan nama apapun, sebagai contoh init.sql
yang berisi :
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 ...
[ ... ]
Menurut resmi mysql dokumentasi, anda dapat menempatkan lebih dari satu file sql di docker-entrypoint-initdb.d`, mereka dieksekusi dalam urutan abjad
I've mencoba Greg's jawaban dengan nol sukses, saya pasti telah melakukan sesuatu yang salah karena database saya tidak punya data setelah semua langkah-langkah: saya menggunakan MariaDB's gambar terbaru, hanya dalam kasus.
Kemudian saya memutuskan untuk membaca entrypoint resmi MariaDB image, dan yang digunakan untuk menghasilkan sederhana docker-menulis file:
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"
Sekarang saya'm mampu bertahan saya data DAN menghasilkan sebuah database dengan saya sendiri skema!
Lainnya cara sederhana, menggunakan docker-menulis dengan baris berikut:
mysql:
from: mysql:5.7
volumes:
- ./database:/tmp/database
command: mysqld --init-file="/tmp/database/install_db.sql"
Menempatkan skema database anda ke dalam ./database/install_db.sql. Setiap kali ketika anda membangun wadah, install_db.sql yang akan dieksekusi.
Setelah Aug. 4, 2015, jika anda menggunakan resmi mysql Docker gambar, anda hanya dapat MENAMBAHKAN/COPY file ke /docker-entrypoint-initdb.d/ direktori dan itu akan berjalan dengan wadah diinisialisasi. Lihat github: https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225 jika anda ingin menerapkannya pada wadah lainnya gambar
Solusi termudah adalah dengan menggunakan 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
Dapatkan di atas CONTAINER_ID dan kemudian mengeksekusi perintah docker log
untuk melihat password yang dihasilkan informasi.
docker logs #<CONTAINER_ID>
Untuk orang-orang yang tidak ingin membuat entrypoint script seperti saya, anda benar-benar dapat mulai mysqld pada waktu membangun dan kemudian mengeksekusi perintah dalam mysql anda Dockerfile seperti:
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';"
Kuncinya di sini adalah untuk mengirim mysqld_safe untuk latar belakang dengan single &
tanda.
Di bawah ini adalah Dockerfile saya berhasil digunakan untuk menginstal xampp, membuat MariaDB dengan skema dan pra diisi dengan info yang digunakan pada server lokal(usrs,pics perintah,dll..)
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
Setelah berjuang sedikit dengan itu, lihatlah Dockerfile menggunakan nama volume (db-data).
It's penting menyatakan plus di bagian akhir, di mana saya menyebutkan bahwa volume [eksternal]
Semua bekerja besar dengan cara ini!
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