Docker - 指令命令

你好,未来的Docker大师们!我很高兴能成为你们在这个激动人心的Docker命令世界中的向导。作为一个教计算机科学多年的老师,我可以告诉你,Docker对开发者来说就像一根魔法棒。它让我们的生活变得如此简单!那么,让我们卷起袖子,一起探索Docker指令命令的迷人领域。

Docker - Commands

CMD 指令

CMD指令就像是电影中的主角——在Docker容器中,它是明星。它告诉Docker在容器启动时要运行什么命令。

基本语法

CMD ["可执行文件", "参数1", "参数2"]

让我们用一个简单的例子来分解这个命令:

FROM ubuntu
CMD ["echo", "Hello, Docker World!"]

在这种情况下,当你运行你的容器时,它会在控制台上打印出"Hello, Docker World!"。就像你的容器一醒来就会挥手问候!

多个CMD指令

这里有一个小陷阱问题:如果你在Dockerfile中有多个CMD指令会发生什么?

FROM ubuntu
CMD ["echo", "第一个命令"]
CMD ["echo", "第二个命令"]

如果你猜两个命令都会运行,那我就很遗憾地告诉你,你掉进了一个常见的陷阱!实际上,只有最后一个CMD指令会被执行。这就像在戏剧中——只有最后一幕才重要!

Shell形式与Exec形式

CMD可以写成两种形式:

  1. Shell形式:CMD 命令 参数1 参数2
  2. Exec形式:CMD ["可执行文件", "参数1", "参数2"]

推荐使用exec形式,因为它更明确,避免了shell解析的问题。

ENTRYPOINT

如果CMD是主角,那么ENTRYPOINT就是我们的Docker电影的导演。它为容器设置了主命令,当容器启动时不能被覆盖。

基本语法

ENTRYPOINT ["可执行文件", "参数1", "参数2"]

让我们看一个例子:

FROM ubuntu
ENTRYPOINT ["echo", "Hello from"]
CMD ["Docker"]

当你运行这个容器时,它将输出"Hello from Docker"。但这里有个有趣的地方!如果你运行容器并添加额外的参数,它们将替换CMD,但不会替换ENTRYPOINT。

docker run myimage World

这将输出"Hello from World"。就像ENTRYPOINT设置了舞台,而CMD(或运行时参数)是在上面表演的演员!

ENV

ENV就像是我们Docker制作的服装部门。它设置了可以在整个容器中使用环境变量。

基本语法

ENV 键=值

这里有一个实际的例子:

FROM ubuntu
ENV MY_NAME="Docker爱好者"
CMD ["sh", "-c", "echo Hello, $MY_NAME!"]

当容器运行时,这将输出"Hello, Docker爱好者!"。就像给容器贴了一个名字标签!

多个ENV指令

与CMD不同,你可以有多个ENV指令,而且它们都会生效:

FROM ubuntu
ENV MY_NAME="Docker爱好者"
ENV MY_DOG=Rex MY_CAT=Fluffy
CMD ["sh", "-c", "echo Hello, $MY_NAME! 你的宠物是$MY_DOG和$MY_CAT。"]

这个容器将问候你并介绍你的宠物!

WORKDIR

WORKDIR就像是我们Docker制作的场景设计师。它为Dockerfile中跟随它的任何命令设置了工作目录。

基本语法

WORKDIR /路径/到/目录

让我们看看它是如何工作的:

FROM ubuntu
WORKDIR /app
COPY . .
CMD ["ls", "-l"]

这个Dockerfile将工作目录设置为/app,复制当前目录内容到其中,然后容器运行时列出内容。就像告诉你的容器:"嘿,在这个目录里给自己找个家!"

多个WORKDIR指令

你可以使用WORKDIR多次来改变目录:

FROM ubuntu
WORKDIR /app
WORKDIR src
WORKDIR scripts
RUN pwd

这将输出/app/src/scripts。就像给容器参观它的新家!

把所有内容放在一起

现在我们已经了解了所有的Docker指令命令,让我们看看它们在现实世界的场景中是如何一起工作的。想象我们在创建一个简单的Python网页应用:

FROM python:3.9-slim

# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# 设置工作目录
WORKDIR /app

# 安装依赖
COPY requirements.txt .
RUN pip install -r requirements.txt

# 复制项目
COPY . .

# 运行应用程序的命令
ENTRYPOINT ["python"]
CMD ["app.py"]

这个Dockerfile设置了一个Python环境,安装了依赖,复制了我们的应用代码,并指定了如何运行应用。就像是为我们的Python应用创建完美环境的食谱!

命令摘要

这是我们涵盖的命令的快速参考表:

命令 描述 示例
CMD 指定容器启动时运行的命令 CMD ["python", "app.py"]
ENTRYPOINT 设置容器的主命令 ENTRYPOINT ["python"]
ENV 设置环境变量 ENV MY_VAR=value
WORKDIR 设置工作目录 WORKDIR /app

记住,这些命令就像是构建你的Docker容器的积木。混合和匹配它们来为你的应用创建完美的环境!

亲爱的学生们,以上就是我们的旅程!我们一起穿越了Docker指令命令的土地,从星光熠熠的CMD到导演式的ENTRYPOINT,再到服装设计的ENV和场景设计的WORKDIR。我希望这个指南为你在Docker冒险中照亮了道路。记住,熟能生巧,所以不要害怕用这些命令进行实验。祝你们愉快地使用Docker!

Credits: Image by storyset