Open7

DockerでMySQLのソースコードをビルドして実行する

tommy34tommy34

Dockerfile

FROM ubuntu:24.04

ENV TZ=Asia/Tokyo
ENV PATH=$PATH:/usr/local/mysql/bin
ENV VERSION=8.0.36

RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && \
  sed -i 's@archive.ubuntu.com@ftp.jaist.ac.jp/pub/Linux@g' /etc/apt/sources.list && \
  echo "bind 'set bell-style none'" >> .bashrc && \
  apt-get update && apt-get install --no-install-recommends -y wget build-essential libssl-dev libncurses5-dev pkg-config cmake cloc && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* && \
  wget -q --no-check-certificate https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-${VERSION}.tar.gz && \
  tar xf mysql-boost-${VERSION}.tar.gz && \
  mkdir mysql-${VERSION}/build

WORKDIR /mysql-${VERSION}/build

RUN cmake .. -DWITH_BOOST=../boost && \
  cmake --build . -j$(nproc) -- install
tommy34tommy34
$ docker --version
Docker version 24.0.6, build ed223bc
$ uname -a
Linux MyComputer 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
tommy34tommy34

コンテナのビルド

$ docker build -t mysql_build .
[+] Building 4738.9s (8/8) FINISHED                                           docker:default
 => [internal] load build definition from Dockerfile                                    2.2s
 => => transferring dockerfile: 854B                                                    0.0s
 => [internal] load .dockerignore                                                       2.0s
 => => transferring context: 2B                                                         0.1s
 => [internal] load metadata for docker.io/library/ubuntu:24.04                         0.0s
 => [1/4] FROM docker.io/library/ubuntu:24.04                                           0.5s
 => [2/4] RUN ln -snf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && echo Asia/To  1515.2s
 => [3/4] WORKDIR /mysql-8.0.36/build                                                   1.6s
 => [4/4] RUN cmake .. -DWITH_BOOST=../boost &&   cmake --build . -j$(nproc) -- i  2808.2s
 => exporting to image                                                                407.7s
 => => exporting layers                                                               407.4s
 => => writing image sha256:41f67eb19072c2604c520bf5c9a9dda54188e235bcacb716f7dfd1fb20  0.1s
 => => naming to docker.io/library/mysql_build                                          0.2s

What's Next?
  View summary of image vulnerabilities and recommendations → docker scout quickview
tommy34tommy34

コンテナでMySQLデーモンを起動し、MySQLクライアントでログインできることを確認した

$ docker run -it --rm --name mysql_build_container mysql_build bash
root@e5e334cd90ac:/usr/local/mysql# mysql --version
mysql  Ver 8.0.36 for Linux on x86_64 (Source distribution)
root@e5e334cd90ac:/usr/local/mysql# PATH=/usr/local/mysql/bin:$PATH
root@e5e334cd90ac:/mysql-8.0.36/build# groupadd mysql
root@e5e334cd90ac:/mysql-8.0.36/build# tail /etc/group
utmp:x:43:
video:x:44:ubuntu
sasl:x:45:
plugdev:x:46:ubuntu
staff:x:50:
games:x:60:
users:x:100:
nogroup:x:65534:
ubuntu:x:1000:
mysql:x:1001:
root@e5e334cd90ac:/mysql-8.0.36/build# useradd -r -g mysql -s /bin/false mysql
root@e5e334cd90ac:/mysql-8.0.36/build# tail /etc/passwd
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
mysql:x:999:1001::/home/mysql:/bin/false
root@e5e334cd90ac:/mysql-8.0.36/build# cd /usr/local/mysql
root@e5e334cd90ac:/usr/local/mysql# ls
LICENSE         README         bin      lib         mysqlrouter-log-rotate  support-files
LICENSE-test    README-test    docs     man         run                     var
LICENSE.router  README.router  include  mysql-test  share
root@e5e334cd90ac:/usr/local/mysql# mkdir mysql-files
root@e5e334cd90ac:/usr/local/mysql# chown mysql:mysql mysql-files
root@e5e334cd90ac:/usr/local/mysql# chmod 750 mysql-files
root@e5e334cd90ac:/usr/local/mysql# mkdir /var/log/mysql
root@e5e334cd90ac:/usr/local/mysql# chown mysql:mysql /var/log/mysql
root@e5e334cd90ac:/usr/local/mysql# chmod 750 /var/log/mysql
root@e5e334cd90ac:/usr/local/mysql# cat <<EOF > /etc/my.cnf
[mysqld]
port=3306
user = mysql
datadir = /usr/local/mysql/mysql-files
general_log = 1
general_log_file = /var/log/mysql/query.log
log-error=/var/log/mysql/error.log
EOF
root@e5e334cd90ac:/usr/local/mysql# mysqld --initialize --user=mysql
root@e5e334cd90ac:/usr/local/mysql# cat /var/log/mysql/error.log
2024-02-12T05:31:15.989301Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.36) initializing of server in progress as process 33
2024-02-12T05:31:16.072002Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-02-12T05:31:33.635705Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-02-12T05:32:27.733854Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: trg2gM2lMD=u
root@e5e334cd90ac:/usr/local/mysql# mysql -u root -ptrg2gM2lMD=u
root@e5e334cd90ac:/usr/local/mysql# mysqld &
[1] 80
root@e5e334cd90ac:/usr/local/mysql# ps aufx
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   4560  3956 pts/0    Ss   05:28   0:00 bash
mysql       80 11.8  2.1 1723832 358720 pts/0  Sl   05:37   0:00 mysqld
root       103  0.0  0.0   7808  3936 pts/0    R+   05:37   0:00 ps aufx
root@e5e334cd90ac:/usr/local/mysql# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.36

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing
this statement.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY "root";
Query OK, 0 rows affected (0.34 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.03 sec)

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+------------------------------------------------------+
| Tables_in_mysql                                      |
+------------------------------------------------------+
| columns_priv                                         |
| component                                            |
| db                                                   |
| default_roles                                        |
| engine_cost                                          |
| func                                                 |
| general_log                                          |
| global_grants                                        |
| gtid_executed                                        |
| help_category                                        |
| help_keyword                                         |
| help_relation                                        |
| help_topic                                           |
| innodb_index_stats                                   |
| innodb_table_stats                                   |
| password_history                                     |
| plugin                                               |
| procs_priv                                           |
| proxies_priv                                         |
| replication_asynchronous_connection_failover         |
| replication_asynchronous_connection_failover_managed |
| replication_group_configuration_version              |
| replication_group_member_actions                     |
| role_edges                                           |
| server_cost                                          |
| servers                                              |
| slave_master_info                                    |
| slave_relay_log_info                                 |
| slave_worker_info                                    |
| slow_log                                             |
| tables_priv                                          |
| time_zone                                            |
| time_zone_leap_second                                |
| time_zone_name                                       |
| time_zone_transition                                 |
| time_zone_transition_type                            |
| user                                                 |
+------------------------------------------------------+
37 rows in set (0.00 sec)

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.36    |
+-----------+
1 row in set (0.00 sec)

mysql>
tommy34tommy34
root@e5e334cd90ac:/usr/local/mysql# mysql --help
mysql  Ver 8.0.36 for Linux on x86_64 (Source distribution)
Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Usage: mysql [OPTIONS] [database]
  -?, --help          Display this help and exit.
  -I, --help          Synonym for -?
  --auto-rehash       Enable automatic rehashing. One doesn't need to use
                      'rehash' to get table and field completion, but startup
                      and reconnecting may take a longer time. Disable with
                      --disable-auto-rehash.
                      (Defaults to on; use --skip-auto-rehash to disable.)
  -A, --no-auto-rehash
                      No automatic rehashing. One has to use 'rehash' to get
                      table and field completion. This gives a quicker start of
                      mysql and disables rehashing on reconnect.
  --auto-vertical-output
                      Automatically switch to vertical output mode if the
                      result is wider than the terminal width.
  -B, --batch         Don't use history file. Disable interactive behavior.
                      (Enables --silent.)
  --bind-address=name IP address to bind to.
  --binary-as-hex     Print binary data as hex. Enabled by default for
                      interactive terminals.
  --character-sets-dir=name
                      Directory for character set files.
  --column-type-info  Display column type information.
  -c, --comments      Preserve comments. Send comments to the server. The
                      default is --skip-comments (discard comments), enable
                      with --comments.
  -C, --compress      Use compression in server/client protocol.
  -#, --debug[=#]     This is a non-debug version. Catch this and exit.
  --debug-check       This is a non-debug version. Catch this and exit.
  -T, --debug-info    This is a non-debug version. Catch this and exit.
  -D, --database=name Database to use.
  --default-character-set=name
                      Set the default character set.
  --delimiter=name    Delimiter to be used.
  --enable-cleartext-plugin
                      Enable/disable the clear text authentication plugin.
  -e, --execute=name  Execute command and quit. (Disables --force and history
                      file.)
  -E, --vertical      Print the output of a query (rows) vertically.
  -f, --force         Continue even if we get an SQL error.
  --histignore=name   A colon-separated list of patterns to keep statements
                      from getting logged into syslog and mysql history.
  -G, --named-commands
                      Enable named commands. Named commands mean this program's
                      internal commands; see mysql> help . When enabled, the
                      named commands can be used from any line of the query,
                      otherwise only from the first line, before an enter.
                      Disable with --disable-named-commands. This option is
                      disabled by default.
  -i, --ignore-spaces Ignore space after function names.
  --init-command=name SQL Command to execute when connecting to MySQL server.
                      Will automatically be re-executed when reconnecting.
  --local-infile      Enable/disable LOAD DATA LOCAL INFILE.
  -b, --no-beep       Turn off beep on error.
  -h, --host=name     Connect to host.
  --dns-srv-name=name Connect to a DNS SRV resource
  -H, --html          Produce HTML output.
  -X, --xml           Produce XML output.
  --line-numbers      Write line numbers for errors.
                      (Defaults to on; use --skip-line-numbers to disable.)
  -L, --skip-line-numbers
                      Don't write line number for errors.
  -n, --unbuffered    Flush buffer after each query.
  --column-names      Write column names in results.
                      (Defaults to on; use --skip-column-names to disable.)
  -N, --skip-column-names
                      Don't write column names in results.
  --sigint-ignore     Ignore SIGINT (CTRL-C).
  -o, --one-database  Ignore statements except those that occur while the
                      default database is the one named at the command line.
  --pager[=name]      Pager to use to display results. If you don't supply an
                      option, the default pager is taken from your ENV variable
                      PAGER. Valid pagers are less, more, cat [> filename],
                      etc. See interactive help (\h) also. This option does not
                      work in batch mode. Disable with --disable-pager. This
                      option is disabled by default.
  -p, --password[=name]
                      Password to use when connecting to server. If password is
                      not given it's asked from the tty.
  -,, --password1[=name]
                      Password for first factor authentication plugin.
  -,, --password2[=name]
                      Password for second factor authentication plugin.
  -,, --password3[=name]
                      Password for third factor authentication plugin.
  -P, --port=#        Port number to use for connection or 0 for default to, in
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
                      /etc/services, built-in default (3306).
  --prompt=name       Set the mysql prompt to this value.
  --protocol=name     The protocol to use for connection (tcp, socket, pipe,
                      memory).
  -q, --quick         Don't cache result, print it row by row. This may slow
                      down the server if the output is suspended. Doesn't use
                      history file.
  -r, --raw           Write fields without conversion. Used with --batch.
  --reconnect         Reconnect if the connection is lost. Disable with
                      --disable-reconnect. This option is enabled by default.
                      (Defaults to on; use --skip-reconnect to disable.)
  -s, --silent        Be more silent. Print results with a tab as separator,
                      each row on new line.
  -S, --socket=name   The socket file to use for connection.
  --server-public-key-path=name
                      File path to the server public RSA key in PEM format.
  --get-server-public-key
                      Get server public key
  --ssl-mode=name     SSL connection mode.
  --ssl-ca=name       CA file in PEM format.
  --ssl-capath=name   CA directory.
  --ssl-cert=name     X509 cert in PEM format.
  --ssl-cipher=name   SSL cipher to use.
  --ssl-key=name      X509 key in PEM format.
  --ssl-crl=name      Certificate revocation list.
  --ssl-crlpath=name  Certificate revocation list path.
  --tls-version=name  TLS version to use, permitted values are: TLSv1.2,
                      TLSv1.3
  --ssl-fips-mode=name
                      SSL FIPS mode (applies only for OpenSSL); permitted
                      values are: OFF, ON, STRICT
  --tls-ciphersuites=name
                      TLS v1.3 cipher to use.
  --ssl-session-data=name
                      Session data file to use to enable ssl session reuse
  --ssl-session-data-continue-on-failed-reuse
                      If set to ON, this option will allow connection to
                      succeed even if session data cannot be reused.
  -t, --table         Output in table format.
  --tee=name          Append everything into outfile. See interactive help (\h)
                      also. Does not work in batch mode. Disable with
                      --disable-tee. This option is disabled by default.
  -u, --user=name     User for login if not current user.
  -U, --safe-updates  Only allow UPDATE and DELETE that uses keys.
  -U, --i-am-a-dummy  Synonym for option --safe-updates, -U.
  -v, --verbose       Write more. (-v -v -v gives the table output format).
  -V, --version       Output version information and exit.
  -w, --wait          Wait and retry if connection is down.
  --connect-timeout=# Number of seconds before connection timeout.
  --max-allowed-packet=#
                      The maximum packet length to send to or receive from
                      server.
  --net-buffer-length=#
                      The buffer size for TCP/IP and socket communication.
  --select-limit=#    Automatic limit for SELECT when using --safe-updates.
  --max-join-size=#   Automatic limit for rows in a join when using
                      --safe-updates.
  --show-warnings     Show warnings after every statement.
  -j, --syslog        Log filtered interactive commands to syslog. Filtering of
                      commands depends on the patterns supplied via histignore
                      option besides the default patterns.
  --plugin-dir=name   Directory for client-side plugins.
  --default-auth=name Default authentication client-side plugin to use.
  --binary-mode       By default, ASCII '\0' is disallowed and '\r\n' is
                      translated to '\n'. This switch turns off both features,
                      and also turns off parsing of all clientcommands except
                      \C and DELIMITER, in non-interactive mode (for input
                      piped to mysql or loaded using the 'source' command).
                      This is necessary when processing output from mysqlbinlog
                      that may contain blobs.
  --connect-expired-password
                      Notify the server that this client is prepared to handle
                      expired password sandbox mode.
  --network-namespace=name
                      Network namespace to use for connection via tcp with a
                      server.
  --compression-algorithms=name
                      Use compression algorithm in server/client protocol.
                      Valid values are any combination of
                      'zstd','zlib','uncompressed'.
  --zstd-compression-level=#
                      Use this compression level in the client/server protocol,
                      in case --compression-algorithms=zstd. Valid range is
                      between 1 and 22, inclusive. Default is 3.
  --load-data-local-dir=name
                      Directory path safe for LOAD DATA LOCAL INFILE to read
                      from.
  --fido-register-factor=name
                      Specifies authentication factor, for which registration
                      needs to be done.
  --authentication-oci-client-config-profile=name
                      Specifies the configuration profile whose configuration
                      options are to be read from the OCI configuration file.
                      Default is DEFAULT.
  --oci-config-file=name
                      Specifies the location of the OCI configuration file.
                      Default for Linux is ~/.oci/config and %HOME/.oci/config
                      on Windows.

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
The following groups are read: mysql client
The following options may be given as the first argument:
--print-defaults        Print the program argument list and exit.
--no-defaults           Don't read default options from any option file,
                        except for login file.
--defaults-file=#       Only read default options from the given file #.
--defaults-extra-file=# Read this file after the global files are read.
--defaults-group-suffix=#
                        Also read groups with concat(group, suffix)
--login-path=#          Read this path from the login file.

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}          Value (after reading options)
----------------------------------------- --------------------------------
auto-rehash                               TRUE
auto-vertical-output                      FALSE
bind-address                              (No default value)
binary-as-hex                             FALSE
character-sets-dir                        (No default value)
column-type-info                          FALSE
comments                                  FALSE
compress                                  FALSE
database                                  (No default value)
default-character-set                     auto
delimiter                                 ;
enable-cleartext-plugin                   FALSE
vertical                                  FALSE
force                                     FALSE
histignore                                (No default value)
named-commands                            FALSE
ignore-spaces                             FALSE
init-command                              (No default value)
local-infile                              FALSE
no-beep                                   FALSE
host                                      (No default value)
dns-srv-name                              (No default value)
html                                      FALSE
xml                                       FALSE
line-numbers                              TRUE
unbuffered                                FALSE
column-names                              TRUE
sigint-ignore                             FALSE
port                                      0
prompt                                    mysql>
quick                                     FALSE
raw                                       FALSE
reconnect                                 TRUE
socket                                    (No default value)
server-public-key-path                    (No default value)
get-server-public-key                     FALSE
ssl-ca                                    (No default value)
ssl-capath                                (No default value)
ssl-cert                                  (No default value)
ssl-cipher                                (No default value)
ssl-key                                   (No default value)
ssl-crl                                   (No default value)
ssl-crlpath                               (No default value)
tls-version                               (No default value)
tls-ciphersuites                          (No default value)
ssl-session-data                          (No default value)
ssl-session-data-continue-on-failed-reuse FALSE
table                                     FALSE
user                                      (No default value)
safe-updates                              FALSE
i-am-a-dummy                              FALSE
connect-timeout                           0
max-allowed-packet                        16777216
net-buffer-length                         16384
select-limit                              1000
max-join-size                             1000000
show-warnings                             FALSE
plugin-dir                                (No default value)
default-auth                              (No default value)
binary-mode                               FALSE
connect-expired-password                  FALSE
network-namespace                         (No default value)
compression-algorithms                    (No default value)
zstd-compression-level                    3
load-data-local-dir                       (No default value)
fido-register-factor                      (No default value)
authentication-oci-client-config-profile  (No default value)
oci-config-file                           (No default value)
tommy34tommy34

ソースコードの行数早く567万行

root@e5e334cd90ac:/mysql-8.0.36# cloc --exclude-dir=build .
   48160 text files.
   25022 unique files.
   22071 files ignored.

github.com/AlDanial/cloc v 1.98  T=187.85 s (133.2 files/s, 43760.0 lines/s)
---------------------------------------------------------------------------------------
Language                             files          blank        comment           code
---------------------------------------------------------------------------------------
C/C++ Header                         18735         559325         880457        2862285
C++                                   3958         360181         456512        1832991
C                                      634          59961          75516         341394
Text                                    96           7337              0         153977
JSON                                    69              0              0         115215
Pascal                                 259          17770          35375         103396
Bourne Shell                            80          14349          16405          91424
m4                                      23           3954            962          36986
CMake                                  392           5504          12507          32891
SQL                                    190           2094           6069          25480
Perl                                   118           7484           4987          23058
XML                                     51            703            131          21640
JavaScript                             125            889            746           7652
Protocol Buffers                        84           1788           5443           6620
Puppet                                  22              0            162           3805
make                                    18            309            297           3645
Markdown                                22            652              4           1870
Starlark                                 9            178            154           1718
Logos                                    4            142             84           1289
Bazel                                    7            128            122           1255
YAML                                    15             42            167            888
Windows Module Definition               10             31            107            884
yacc                                     2            146             77            771
Python                                   6            176            113            648
reStructuredText                        12            172              0            506
awk                                      4             25             74            502
lex                                      3            211            123            501
PowerShell                               4             47             43            363
SWIG                                     1            116            226            355
Assembly                                 1             87            158            331
CSV                                      5              0              0            286
HTML                                     1              9              0            272
INI                                     13             54              0            246
LLVM IR                                  1             44              0            231
Bourne Again Shell                       5             46            157            216
Windows Resource File                    6             44            124            205
Ruby                                     9             21             10            202
PHP                                      3             67             17            196
ERB                                      1             36             13            182
AsciiDoc                                 2             74              0            169
WiX source                               2             38             38            140
ReasonML                                 2            122            968            136
Lisp                                     1             46             85             96
NAnt script                              1             30              0             76
vim script                               1             13             42             50
CSS                                      3             11             17             44
DOS Batch                                4             10             46             36
Visual Studio Solution                   1              0              1             24
DTD                                      1              0              6             15
Visual Basic                             1              0              0             15
Windows Message File                     2              4             41             12
Dockerfile                               1              1              4             11
diff                                     1              0              1              5
Visual Basic Script                      1              1             21              4
---------------------------------------------------------------------------------------
SUM:                                 25022        1044472        1498612        5677209
---------------------------------------------------------------------------------------