Dockerfile.dev
```Dockerfile
FROM ubuntu:latest
RUN apt-get update && \
apt-get install -y openjdk-11-jdk
```
```bash
docker build -t my-image -f Dockerfile.dev .
```
docker-compose
```yml
version: "3"
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
```
CMD 和 ENTRYPOINT 都是 Dockerfile 中用來指定容器啟動時要執行的命令的關鍵字,不同的是它們的作用和使用方式有所不同。
CMD 是指定在容器啟動時執行的默認命令。如果在運行容器時沒有指定要執行的命令,那麼就會執行 CMD 指定的默認命令。 Dockerfile 中可以使用多個 CMD 指令,但只有最後一個 CMD 會被執行。如果在運行容器時指定了要執行的命令,那麼 CMD 指令的默認命令會被覆蓋。
ENTRYPOINT 也是指定在容器啟動時要執行的命令,但與 CMD 不同的是,它指定的命令是容器的入口點,即在容器啟動時一定會被執行的命令。 Dockerfile 中可以使用多個 ENTRYPOINT 指令,但只有最後一個 ENTRYPOINT 會被執行。如果在運行容器時指定了要執行的命令,那麼該命令會作為參數傳遞給 ENTRYPOINT 指定的入口點命令來執行。
因此,如果一個容器只需要運行一個命令,且該命令可以通過在運行容器時指定參數來實現不同的功能,那麼就應該使用 CMD。如果一個容器需要在啟動時進行一些特定的初始化操作,並且一定需要執行一個特定的命令,那麼就應該使用 ENTRYPOINT。
---
以下是一個簡單的 Spring Boot 應用程式的 Dockerfile 範例。這個範例使用 OpenJDK 作為基礎映像,並將 Spring Boot JAR 檔添加到容器中。
**Dockerfile:**
```
# 使用 OpenJDK 11 作為基礎映像
FROM openjdk:11-jre-slim
# 設定工作目錄
WORKDIR /app
# 將本地的 JAR 檔複製到容器中
COPY build/libs/demo-0.0.1-SNAPSHOT.jar app.jar
# 開放應用程式運行的端口(Spring Boot 默認使用 8080)
EXPOSE 8080
# 定義啟動應用程式的命令
CMD ["java", "-jar", "app.jar"]
```
請注意以下事項:
- `FROM openjdk:11-jre-slim` 使用 OpenJDK 11 作為基礎映像。
- `WORKDIR /app` 設定工作目錄為 `/app`。
- `COPY build/libs/demo-0.0.1-SNAPSHOT.jar app.jar` 將本地的 Spring Boot JAR 檔複製到容器的 `/app` 目錄中。
- `EXPOSE 8080` 開放容器內部的 8080 端口,這是 Spring Boot 默認的端口。
- `CMD ["java", "-jar", "app.jar"]` 定義容器啟動時要執行的命令,即運行 Spring Boot 應用程式。
在實際應用中,你應該根據你的專案結構和需求進行一些調整。確保將 `demo-0.0.1-SNAPSHOT.jar` 替換為你實際生成的 JAR 檔名稱。
要建立 Docker 映像,可以在 Dockerfile 所在的目錄中執行以下命令:
```bash
docker build -t your-image-name .
```
然後,你可以運行映像:
```bash
docker run -p 8080:8080 your-image-name
```
這將啟動包含你的 Spring Boot 應用程式的 Docker 容器。確保将 `your-image-name` 替換為你指定的映像名稱。