🐳
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