Write the Code. Change the World.

12月 25

在 Docker Compose 中,command字段定义的命令是在容器启动时执行的默认命令。这意味着每次启动或重启容器时,都会执行command中定义的命令。

如果你希望在容器创建时执行一次特定的命令,而不是每次启动都执行,可以使用以下方法:

使用 entrypoint 脚本:

在 Docker Compose 中,你可以通过创建一个自定义的 entrypoint 脚本来实现在容器创建时执行一次的操作。entrypoint 脚本是在容器启动时执行的脚本,通常被用于初始化工作。

例如,你可以创建一个名为 entrypoint.sh 的脚本文件,然后在 docker-compose.yml 文件中引用它:

version: '3'

services:
  my-service:
    build:
      context: .
    entrypoint: /app/entrypoint.sh
    # 其他服务配置...

在 entrypoint.sh 中,你可以编写需要在容器创建时执行的命令,并在最后调用 exec "$@" 以保持容器正常运行:

#!/bin/bash

# 在容器创建时执行的命令
echo "Initialization command"

# 执行 CMD 中定义的命令
exec "$@"

这样,entrypoint.sh 中的命令将只在容器创建时执行一次。

将 command 配置在 Dockerfile 的 cmd 中

如果你只希望在容器创建时执行一次特定的命令,而不是每次启动都执行,可以将该命令直接包含在 Dockerfile 中。在 Dockerfile 的 CMD 指令中设置你希望执行的命令,而不在 docker-compose.yml 中的 command 中设置。

Dockerfile 示例:

FROM your-base-image

# 在容器创建时执行的命令
CMD ["your-initialization-command"]

# 其他 Dockerfile 配置...

在这种情况下,CMD 中定义的命令将只在容器创建时执行一次。

12月 25

给 mysql 数据库,常规来说得能访问 mysql 和 .sql 文件。对于 docker,可以通过映射或copy 的方式,将 .sql 语句弄到容器中,再执行 sql 语句。这种方式虽然可以实现,但感觉还是太麻烦了。还不如在宿主机,直接执行。 docker 提供了 exec 命令,可以用来搞定。

docker exec -i fa7 mysql -u zeipan -pzeipanpwd zeipan < /zeipan/conf/mysql/zeipan.sql

其中

  • -u zeipan 数据库用户名
  • -pzeipanpwd 数据库密码
  • zeipan 数据库库名
  • /zeipan/conf/mysql/zeipan.sql 宿主机的 sql 文件

这种方式虽然可以搞定。但是会报一个下边这样的警告。不让把密码直接弄到终端上。

mysql: [Warning] Using a password on the command line interface can be insecure.
12月 25

先查看

php

<?php
// 获取单个上传文件的最大大小
$uploadMaxFilesize = ini_get('upload_max_filesize');

// 获取 POST 请求的最大大小
$postMaxSize = ini_get('post_max_size');

echo "upload_max_filesize: $uploadMaxFilesize\n";
echo "post_max_size: $postMaxSize\n";
?>

也可以在 phpinfo() 函数中找到。

nginx

nginx -T | grep client_max_body_size

再修改

这里以 docker 来说。 如果没做宿主机配置文件和容器的映射就做一个,如果做了就修改配置文件。

假如这里没做映射。

在宿主机 compose.yaml 文件对应的目录下。新建 ./conf/php/php.ini 文件,加入以下配置。

# 单个上传文件的大小
upload_max_filesize = 50M

# 请求的最大大小
post_max_size = 50M

这里很灵活,只加想加的配置即可。

然后修改 compose.yaml 配置文件。

  php82:
    …
    volumes:
      - ${SOURCE_DIR}:/www/:rw
      - ${CONF_DIR}/php/php.ini/:/usr/local/etc/php/php.ini
      - ${LOG_DIR}/php82:/var/log/php

然后重启 php, 使得配置生效。

# 请记得 php82 是 compose.yaml 文件中,配置的 service 的名字。
docker-compose restart php82

这样就好了。