您好,我已经尝试了很多东西,但是看来我无法使用docker文件创建数据库和用户,请您帮我,我正在尝试以下操作:
运行sudo yum install mysql-server -y 运行sudo systemctl启用mysqld 运行mysql -v -e“创建数据库测试;”
ERROR 2002 (HY000): Can't connect to local MySQL server through
socket '/var/lib/mysql/mysql.sock' (2)
ERROR 2002 (HY000): Can't connect to local MySQL server through
socket '/var/lib/mysql/mysql.sock' (2)
The command '/bin/sh -c mysql -v -e "create database test;"' returned
a non-zero code: 1 `
可以在不使用docker compose的情况下使用dockerfile实现此功能吗?
谢谢
答案 0 :(得分:0)
我强烈建议您使用Docker Hub mysql
image而不是尝试自己动手。您无法创建预加载了数据库数据或配置的派生图像,但是可以将SQL脚本放入/docker-entrypoint-initdb.d
中,该脚本将在首次启动时运行,并且可以使用环境变量来完成一些非常基本的配置。>
您不必使用Docker Compose(尽管对于基本的多容器设置当然很方便)。没有Compose,您可以像这样一起启动应用程序和数据库:
# Create a network so the containers can see each other
docker network create a-network
# Start the database
# (You can also add an option
# -v $PWD/initdb:/docker-entrypoint-initdb.d \
# to run ./initdb/setup.sql and similar scripts)
docker run -d \
--net a-network \
--name database \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root-password \
-e MYSQL_DATABASE=test \
-e MYSQL_USER=test \
-e MYSQL_PASSWORD=test \
mysql:8
# Start the application
docker run -d \
--net a-network \
--name myapp \
-p 8080:8080 \
-e MYSQL_HOST=database \
-e MYSQL_DATABASE=test \
-e MYSQL_USER=test \
-e MYSQL_PASSWORD=test \
myapp:20200809
(一个docker-compose.yml
文件看起来非常相似,但是使用YAML语法而不是docker run
命令来具有。)
在问题中的Dockerfile片段中,sudo
和systemctl
都不在Docker中真正起作用。 (对于sudo
,通常没有用户密码,也没有机会在Dockerfile中键入一个; systemctl
仅在systemd
守护程序正在运行时才起作用,并且几乎永远不会每个RUN
命令都在干净的环境中运行,并且不会在RUN
命令中保留正在运行的进程,因此您的RUN mysql ...
步骤未在运行该数据库可以附着。
原则上,这是可能的。您必须启动数据库服务器,然后运行mysql
命令,然后干净地停止数据库,所有操作都在同一RUN
步骤中进行。这有点棘手;配置标准映像会容易得多。