无法使用sed自定义mariadb Dockerfile中的缓冲区大小

无法使用sed自定义mariadb Dockerfile中的缓冲区大小,sed,docker,Sed,Docker,我正试图定制一个mariadb容器,使其具有更大的innodb缓冲区大小。我的理想方案是使用sed,这样我就不必维护重复的My.cnfconfig文件 这是我的Dockerfile,但它并没有像我预期的那样替换值,我也不确定我做错了什么 FROM mariadb:10.1 RUN sed -ri 's/innodb_buffer_pool_size\\ =\\ 256M/innodb_buffer_pool_size\\ =\\ 512M/g' /etc/mysql/my.cnf \

我正试图定制一个mariadb容器,使其具有更大的innodb缓冲区大小。我的理想方案是使用
sed
,这样我就不必维护重复的
My.cnf
config文件

这是我的Dockerfile,但它并没有像我预期的那样替换值,我也不确定我做错了什么

FROM mariadb:10.1

RUN sed -ri 's/innodb_buffer_pool_size\\ =\\ 256M/innodb_buffer_pool_size\\ =\\ 512M/g' /etc/mysql/my.cnf \
    && cat /etc/mysql/my.cnf | grep innodb;
其输出为:

Sending build context to Docker daemon 231.9 MB
Step 1 : FROM mariadb:10.1
 ---> 9a0138c02438
Step 2 : RUN sed -ri 's/innodb_buffer_pool_size\\ =\\ 256M/innodb_buffer_pool_size\\ =\\ 512M/g' /etc/mysql/my.cnf     && cat /etc/mysql/my.cnf | grep innodb;
 ---> Running in eaedaf2837ff
#innodb_log_file_size   = 50M
innodb_buffer_pool_size = 256M
innodb_log_buffer_size  = 8M
innodb_file_per_table   = 1
innodb_open_files       = 400
innodb_io_capacity      = 400
innodb_flush_method     = O_DIRECT
#innodb_autoinc_lock_mode=2
#innodb_flush_log_at_trx_commit=0
 ---> b0e479c55581
Removing intermediate container eaedaf2837ff
Successfully built b0e479c55581

我尝试过用
\\
逃出空格,但没有运气逃出空格。

只是不要像你那样逃出空格:

  • 空间不需要逃逸
  • 在简单引号中使用
    \\
    进行转义实际上会创建一个
    \
    字符。难怪正则表达式不能工作
  • 这是有效的:

    sed -i 's/innodb_buffer_pool_size = 256M/innodb_buffer_pool_size = 512M/g' /etc/mysql/my.cnf
    
  • 如果你真的要逃避某些东西,那将只是因为正则表达式,而不是shell,因为你使用了简单的引号,shell不会解释内容
  • 对于这个特定的示例,您不需要使用
    -r,--regexp extended
    开关。regexp extended包括诸如正向查找之类的东西,这里不需要
  • 改进:使用组调用匹配的值。如果必须更改参数名称,则可减少维护

    sed -i 's/\(innodb_buffer_pool_size\) = 256M/\1 = 512M/g' /etc/mysql/my.cnf
    
    或匹配多个参数名称

    sed -i 's/\(innodb_buffer_pool_size\|some_other_param\) = 256M/\1 = 512M/g' /etc/mysql/my.cnf
    

    你到底为什么要尝试逃离空间?你过去做过什么不得不逃离空间的事情吗?这似乎是一件非常随机的事情,突然决定可能是个好主意,所以我想知道你过去是否做过一些错误的事情(例如不引用字符串),并且发现你可以让它“工作”“通过逃离空间而不是正确的方式,不管那是什么!