自学 docker,自己写的 Dockerfile 语法编译通过不了,有哪些错误,请前辈指正

2022-12-06 14:01:54 +08:00
 slove
#基于 ubuntu 最新版镜像
FROM ubuntu:latest
#更新安装包列表
RUN apt update
#安装 apache2
RUN apt install apache2
#安装 mysql-server
RUN apt install mysql-server
#启动 mysql
RUN service mysql start
#登陆 mysql
RUN mysql
#修改 root 密码
RUN alter user “root”@“localhost” identified with mysql_native_password by “12345”;
#root 密码生效
RUN flush privileges ;
#新建数据库
RUN create database wordoress ;
#新建用户
RUN create user “solve”@“localhost” identufied by “888888”;
#配置数据库用户
RUN grant all on wordpress.* to “slove”@“localhost” with grant option ;
#配置生效
RUN flush privileges ;
#退出数据库
RUN exit
#下载 wordpress 最新版到指定 /var/www/html/
ADD https://cn.wordpress.org/latest-zh_CN.tar.gz /var/www/html
#开放端口号
EXPOSE 80
CMD
2899 次点击
所在节点    Docker
38 条回复
lxzxl
2022-12-06 15:13:44 +08:00
slove
2022-12-06 15:13:50 +08:00
@Puteulanus
a | b ,a 执行完结果扔给 b 执行,不知道我理解的对不对
deplivesb
2022-12-06 15:31:48 +08:00
你这个真把 docker 当成虚拟机用了,启动一个 ubuntu 系统,安装一个 Apache 再安装一个 MySQL ,你这个干啥呢?
slove
2022-12-06 15:33:25 +08:00
@starqoq 感谢,虽然你说的很多不理解,感觉是大佬
@zhenrong 感谢
@wunonglin 学习环境,玩坏了,就直接删除,挺方便的
@lxzxl 我再认真看文档去,感谢

感谢以上所有人的回复,谢谢
slove
2022-12-06 15:34:36 +08:00
@deplivesb 装个学习环境,玩坏了,就直接删库跑路,不会被抓,哈哈
dier
2022-12-06 16:35:03 +08:00
你这个误区有点多,我一时不知道从哪讲起。既然你说想练习 Dockerfile 语法,那我先从 Docker 的理解说起
Docker 推荐一个容器只运行一个服务,例如你这个环境的最优做法是 MySQL 服务构建一个镜像,Apache 服务再构建一个镜像。
原因就是容器在运行时必须要有一个主服务进程在前台持续运行,一般建议这个进程就是容器要运行的服务进程。当这个服务的进程停止时,容器会以为这个服务运行结束,容器则结束运行退出。
如果你在一个容器里运行了多个服务,比如 MySQL 和 Apache ,你以其中一个服务为主服务使其在前台运行,如果另外一个服务意外终止了,你排查时会发现这个容器的状态还是运行状态。就没办法从容器的状态直接判断出来服务是否正常(简单的比喻就是你明明结束了 MySQL 的进程,但用其它命令查看 MySQL 端口发现它还在监听,你觉得是还在运行还是已经结束了?)。因为容器在运行时,你从外部是不容易观察到容器内的运行情况。

再说 Dockerfile;
用再说 Dockerfile 构建镜像时,Dockerfile 中的每个以大写开头的 FROM\RUN\ADD\COPY\CMD 都会像是一层饼,如果你要通过 RUN 做一些操作,就尽量写在这一个 RUN 下,以减少镜像的层数,同时也能防止一个镜像最后体积变得很大。
例如:
```shell
RUN apt update && \
apt install aptech curl bash && \
rm /tmp/*.gz
```
另外,练习 Dockerfile 可以到 hub.docker.com 上去看看一些服务官方的镜像。基本上都有附 Dockerfile 的 github 的地址。建议先基于官方的 Dockerfile 来改着试试理解怎么写 Dockerfile

最后,Dockerfile 排错。在使用 docker build 构建时,你每写的一个大写开头的命令都是一层,会从上到下依次执行,如果哪一层有问题,会提示准确的行级信息来供你排查是哪些命令编写有问题。
hsfzxjy
2022-12-06 16:46:06 +08:00
建议先学 shell/bash 语法和相关知识,还是基础知识不够

如果你写成 shell 脚本能跑通,那改成 Dockerfile 基本也可以
slove
2022-12-06 16:46:57 +08:00
@dier 嗯嗯,你的回复对我帮助很大,谢谢
dev436
2022-12-06 18:17:49 +08:00
您好,您给出的 Dockerfile 中存在一些语法错误和书写不规范的问题。我尝试纠正这些问题,并给出修改后的 Dockerfile 内容:
dev436
2022-12-06 18:18:04 +08:00
# 基于 ubuntu 最新版镜像
FROM ubuntu:latest

# 更新安装包列表
RUN apt update

# 安装 apache2
RUN apt install -y apache2

# 安装 mysql-server
RUN apt install -y mysql-server

# 启动 mysql
RUN service mysql start

# 登录 mysql
RUN mysql -u root

# 修改 root 密码
RUN alter user "root"@"localhost" identified with mysql_native_password by "12345";

# root 密码生效
RUN flush privileges;

# 新建数据库
RUN create database wordpress;

# 新建用户
RUN create user "solve"@"localhost" identified by "888888";

# 配置数据库用户
RUN grant all on wordpress.* to "solve"@"localhost" with grant option;

# 配置生效
RUN flush privileges;

# 退出数据库
RUN exit

# 下载 wordpress 最新版到指定 /var/www/html/
ADD https://cn.wordpress.org/latest-zh_CN.tar.gz /var/www/html

# 开放端口号
EXPOSE 80

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
slove
2022-12-06 19:17:07 +08:00
@dev436 这个语句到# 修改 root 密码 RUN alter user "root"@"localhost" identified with mysql_native_password by "12345";就不行了。二楼说的对,RUN 命令执行完就结束了,sql 命令没在 mysql 里执行,网上搜了下,基本是单独做个 shell 脚本,引入 sql 语句,再执行数据库操作。
有没有大佬知道单独语句怎么写,这样写不知对不对:RUN /bin/sh -c mysql -uroot <"alter user "root"@"localhost" identified with mysql_native_password by "12345"";
g001
2022-12-06 20:41:47 +08:00
FROM ubuntu:latest:您在使用 : 分隔镜像名称和标签时,应该使用英文的冒号而不是中文的冒号。正确的语法应该是 FROM ubuntu:latest 。
alter user “root”@“localhost”:您在使用字符串时,应该使用英文的双引号而不是中文的双引号。正确的语法应该是 alter user "root"@"localhost"。
mysql_native_password by “12345”;:您在定义密码时,应该使用英文的双引号而不是中文的双引号。正确的语法应该是 mysql_native_password by "12345"
slove
2022-12-06 21:13:26 +08:00
@g001 中英文是我在车上手机编辑的,主要问题不在这里,我的意思还是在 Dockerfile 里使用 sql 命令创建和修改用户权限
slove
2022-12-07 20:54:30 +08:00
https://ibb.co/t8vMj7b
https://ibb.co/4tswdv8
https://ibb.co/WyLyQN7
我把代码用这种方式重新写了,大佬帮忙看下,可有问题,抱拳感谢
slove
2022-12-07 20:55:31 +08:00
slove
2022-12-07 21:01:35 +08:00
slove
2022-12-07 21:14:44 +08:00
不会贴图
---------Dockerfile--------------
FROM ubuntu:latest
COPY run.sh /root/test/run.sh
COPY my.sql /root/test/my.sql
RUN apt update
RUN apt install mysql-server -y
EXPOSE 3306
CMD ["sh", "/root/test/run.sh"]


---------run.sh--------------
#!bin/bash
#查看 mysql 运行状态
echo '1.查看 mysql 服务状态...'
service mysql status
echo '2.启动 mysql 服务...'
service mysql start
echo '3.导入 sql 命令...'
mysql < /root/test/my.sql
echo '4.执行完毕...'
---------my.sql--------------
use mysql;
#修改 root 密码
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
#创建数据库 wordpress
create database Wordpress;
#创建用户 slove
create user 'slove'@'localhost' identified by '888888';
#设置 wordpress 数据库用户
grant all on wordpress.* to 'slove'@'localhost' with grant option;
#配置生效
flush privileges;
qq296015668
2023-03-02 15:49:45 +08:00
简单的看了下,按照 op 给出的部分代码,简单的给出大致样本,但是有几个问题需要解决
1. `service mysql start` 这条命令无法在构建是启动
2. 缺少 `php` 依赖,就算构建成功也无法访问 wordpress
3. 就算补全了 `php` 相关依赖,apache2 也缺少配置

总之,只能给出一个大致的样本供参考。另外 `wordpress` 有 [官方镜像]( https://hub.docker.com/_/wordpress)


```Dockerfile

FROM ubuntu:22.04

ARG MYSQL_ROOT_PASSWORD 12345
ARG DB_PASSWORD 888888

ARG DEPENDENCIES=" \
apache2 \
mysql-server \
wget"

RUN apt-get update && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
apt-get install -y --no-install-recommends ${DEPENDENCIES} && \
rm -rf /var/lib/apt/lists/*

RUN service mysql start # 无法执行成功

RUN mysql -uroot -e "\
create database wordoress; \
create user 'solve'@'localhost' identufied by '${DB_PASSWORD}'; \
grant all on wordoress.* to 'solve'@'localhost'; \
alter user 'root'@'localhost' identified with mysql_native_password by '${MYSQL_ROOT_PASSWORD}'; \
flush privileges;"

WORKDIR /var/www/html
RUN wget https://cn.wordpress.org/latest-zh_CN.tar.gz && \
tar -xf latest-zh_CN.tar.gz \
rm -f latest-zh_CN.tar.gz

EXPOSE 80
CMD ["/bin/bash"]
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/900487

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX