docker-compose volume映射问题

问题如下:

下载一个mysql或者tomcat的镜像 在docker-compose中的映射卷如下:


        volumes:
            - "/home/oneaccess/oneaccess/mysql/conf:/etc/mysql"
            - "/home/oneaccess/oneaccess/mysql/data:/var/lib/mysql"
            - "/home/oneaccess/oneaccess/mysql/logs:/var/log/mysql"

将虚拟机的/home/oneaccess/oneaccess/mysql/data映射到容器的mysql的数据目录/var/lib/mysql

问题来了: 如果我虚拟机的目录不放任何东西 则mysql容器都启动失败

因为会将本地的数据映射到容器 本地为空 容器的也被映射为空目录

我的处理方法是 启动容器(不映射) 然后进入容器 将对应的目录复制到本机

然后再关掉机器 重新映射数据卷 然后就启动成功了

目前遇到的问题: 使用docker-compose 构建本地的logstash镜像

dockerfile中的书写如下:

ENV MEDIA_MYSQL mysql-connector-java-5.1.46.jar
ENV MEDIA_LOGSTASH logstash-output-jdbc.zip
RUN rpm --rebuilddb && yum install -y expect
WORKDIR /data
COPY ./packages/** ./
RUN mkdir /data/logstash && tar -zxvf logstash-6.8.4.tar.gz --strip-components 1 -C /data/logstash
RUN cp $MEDIA_MYSQL /data/logstash/lib/
RUN cp  $MEDIA_LOGSTASH /data/logstash/
WORKDIR /data/logstash
RUN bin/logstash-plugin install file:///data/logstash/$MEDIA_LOGSTASH
RUN ls /data
RUN /usr/bin/expect /data/auto.sh
RUN ls /data/logstash/config
RUN bin/logstash-keystore list

ENTRYPOINT ./bin/logstash -f ./config/logstashbam.conf >logs/logstash.log 2>&1

其中auto.sh`内容如下

#!/usr/bin/expect -f
set timeout 30
set PASSWORD "Bamboocloud@1234"
set MYSQL_PORT "3306"
set MYSQL_HOST "db"
set DRIVER_JAR_PATH "/data/logstash/lib/mysql-connector-java-5.1.46.jar"
spawn /data/logstash/bin/logstash-keystore create
expect {
"Continue without password protection on the keystore" { send "yes\r"; }
}
expect eof
spawn /data/logstash/bin/logstash-keystore add BIM_PWD
expect  "*"
send "$PASSWORD\r"
expect eof

spawn /data/logstash/bin/logstash-keystore add MYSQL_PORT
expect  "*"
send "$MYSQL_PORT\r"
expect eof

spawn /data/logstash/bin/logstash-keystore add MYSQL_HOST
expect  "*"
send "$MYSQL_HOST\r"
expect eof

spawn /data/logstash/bin/logstash-keystore add DRIVER_JAR_PATH
expect  "*"
send "$DRIVER_JAR_PATH\r"
expect eof

构建好容器启动以后,发现配置文件中的变量并没有读取到,分析日志得到原因:

image.png
宿主机并没有logstah-keystore这个文件....导致读取不到变量

那么问题来了.....

难不成先不映射config 进入容器把文件捞出来....放在宿主机的conf下 然后再映射...感觉好low

阅读 11.7k
3 个回答

mysql启动需要先读取配置文件,然后初始化,默认的配置文件路径是/etc/my.cnf,如果你把它映射到了宿主机本地的某个目录则要确保宿主机目录上有my.cnf文件并确保容器的启动用户拥有读权限,同理默认的数据目录为/var/lib/mysql,如果映射了它需要确保容器用户对宿主机这个目录有读写权限。

是的,我也觉得好LOW,
有一个办法是用volumn,这样容器启动的时候如果宿主机没有文件,但是容器有文件,会使用容器里的文件;如果宿主机有文件,就会使用宿主机的文件。
但是呢volumn是docker管理的,又不能自定义宿主机上的位置,蛋疼

LOW!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题