🐳

Devcontainerでのコンテナ開発のファイル構成

に公開

Devcontainer開発でdevcontainer.json/Dockerfile/compose.ymlでの使い分けについて検証したのでまとめてみました。Dockerfileやcompose.ymlの単品や組み合わせ利用はDevcontainerなしで開発するとき用なので今回の検証から除外してます。

条件

・projectディレクトリをコンテナ内にバインド
・ポートは双方向5000番を使用
・VS Code拡張機能2つ使用

Tree構成

project
├── .devcontainer
│ ├── devcontainer.json
│ ├── docker-compose.yml
│ └── Dockerfile
└── (プロジェクトのソースコードなど)

devcontainer.json単品

devcontainer.json
{
  "name": "Python 3.11 Flask",
  // Use base image
  "image": "python:3.11-slim",
  "workspaceFolder": "/workspace/project",
  // Set container service
  "runArgs": [
    "--user", "root",
    "--publish", "5000:5000"
  ],
  // VSCode customizations
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-python.python",
        "ms-azuretools.vscode-docker"
      ]
    }
  },
  // Mount project folder into the container
  "mounts": [
    "source=${localWorkspaceFolder},target=/workspace/project,type=bind"
  ],
  // Set the container to use root user (if required)
  "remoteUser": "root",

  // run command
  "postCreateCommand": "while sleep 1000; do :; done"
}

devcontainer.jsonとDockerfile

devcontainer.json
{
  "name": "Python 3.11 Flask",
  // Use Dockerfile for container build
  "dockerFile": "./Dockerfile",
  // VSCode customizations
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-python.python",
        "ms-azuretools.vscode-docker"
      ]
    }
  },
  // Mount project folder into the container
  "mounts": [
    "source=${localWorkspaceFolder},target=/workspace/project,type=bind"
  ],
  // Set the container to use root user (if required)
  "remoteUser": "root",

  // Forward port 5000 to the host machine
  "forwardPorts": [
    5000
  ]
}
Dockerfile
# Use an official Python runtime as a parent image
FROM python:3.11-slim

# Run as root user
USER root

# Set the working directory in the container
WORKDIR /workspace

# Expose the port that Flask will run on
EXPOSE 5000

# Set the command to keep the container running (like in the original docker-compose command)
CMD ["sh", "-c", "while sleep 1000; do :; done"]

devcontainer.jsonとcompose.yml

devcontainer.json
{
  "name": "Python 3.11 Flask",

  // Using Docker Compose
  "dockerComposeFile": "docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/workspace/project",

  // VSCode customizations
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-python.python",
        "ms-azuretools.vscode-docker"
      ]
    }
  }
}
docker-compose.yml
version: '3'
services:
  # main service app
  app:
    image: python:3.11-slim
    user: root
    ports:
      - "5000:5000"
    volumes:
      - ../../project:/workspace/project
    working_dir: /workspace/project
    # Overrides default command so things don't shut down after the process ends.
    command: /bin/sh -c "while sleep 1000; do :; done"

devcontainer.jsonとDockerfileとcompose.yml

devcontainer.json
{
    "name": "Python 3.11 Flask",

    // Build Docker Compose
    "dockerComposeFile": "./docker-compose.yml",
    "service": "app",
    "workspaceFolder": "/workspace/project",

    // Configure VSCode properties.
    "customizations": {
        "vscode": {
            "extensions": [
                "ms-python.python",
                "ms-azuretools.vscode-docker"
            ]
        }
    }
}
Dockerfile
# Use an official Python runtime as a parent image
FROM python:3.11-slim

# Run as root user
USER root

# Set the working directory in the container
WORKDIR /workspace
compose.yml
version: '3'
services:
  # main service app
  app:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
    user: root
    ports:
      - "5000:5000"
    volumes:
      - ../../project:/workspace/project
    # Overrides default command so things don't shut down after the process ends.
    command: /bin/sh -c "while sleep 1000; do :; done"

終わりに

組み合わせに制限なくコード管理や開発の仕方に応じて利用可能だということが実証できました。Devcontainer=VS Codeでの開発検証になるので、実環境での動作運用も考慮したコード構成できそうで便利かと思いました。

Discussion