はじめに
Docker開発が苦手やねん。とにかく試行錯誤して仕事に近い感じでアレンジしながら作ってみる。アレルギーを克服しろ!
記事の量は最低限に
最低限のファイル構成
こんな感じ(モノRepositoryはベストプラクティスではない。現場がそうだってだけ)
docker_world
├── .gitignore
├── frontend
│ ├── .devcontainer
│ │ ├── devcontainer.json
│ │ └── Dockerfile
│ ├── src
│ │ └── pages
│ │ └── index.tsx
│ ├── package.json
│ └── README.md
└── backend
├── .devcontainer
│ ├── devcontainer.json
│ └── Dockerfile
├── src
│ ├── main.py
│ └── requirements.txt
└── README.md
frontend/node_modules/
frontend/.next/
**/__pycache__/
frontend
File - Open Folder
で frontend のフォルダを開く
devcontainer.json(新規)
{
"name": "Node.js Dev Container",
"dockerFile": "./Dockerfile",
"postCreateCommand": "npm i"
}
Dockerfile(新規)
ENVとRUNのapt-getのとこはpythonやnextjsでもかまわずコピペでやってる
FROM node:latest
ENV TZ=Asia/Tokyo
RUN apt-get update && apt-get install -y \
bash curl git openssh-client zip \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
package.json(新規)
このセットはたしかNext.jsをすっぴんセットアップしてできあがるやつだったような気がする。ご自由にどうぞ
{
"name": "next.js",
"version": "1.0.0",
"description": "Your project description",
"main": "index.js",
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
},
"dependencies": {
"next": "13.2.4",
"react": "18.2.0",
"react-dom": "18.2.0"
},
"devDependencies": {
"@types/node": "22.7.4",
"@types/react": "18.3.11",
"typescript": "5.6.2"
}
}
devcontainerを起動
左下のへんなマークを押して Reopen in Conteiner
devcontainerを起動したときの処理の流れは
- devcontainer が dockerFile をビルドする
- 終わったら postCreateCommand を実行する
{
"name": "Node.js Dev Container",
"dockerFile": "./Dockerfile",
"postCreateCommand": "npm i"
}
ハマりがちなのが、親ディレクトリに遡ることはできませんという仕様。pip install
を Dockerfile
のなかでやろうとしたときに、大概この仕様で大ハマリする
(ChatGPT)
Dockerfile内では、ビルドコンテキストが制限されており、親ディレクトリに遡ることはできません。これはセキュリティとコンテナの隔離を保つためです。具体的には、以下のような制限があります:
ビルドコンテキストの制限: Dockerfileは、指定されたビルドコンテキスト内でのみファイルをコピーしたり、アクセスしたりできます。ビルドコマンドを実行する際に指定したディレクトリ(例えば、docker build -t myapp .で.を指定した場合、そのディレクトリがビルドコンテキストになります)に制限されます。
COPYコマンドの制約: COPYやADDコマンドで親ディレクトリやそれ以外のディレクトリからファイルをコピーすることはできません。例えば、COPY ../file.txt /app/のように親ディレクトリを指定すると、エラーが発生します。
index.tsx
import type { NextPage } from 'next'
const Home: NextPage = () => {
return (
<div>
<h1>Hello World</h1>
</div>
)
}
export default Home
README.md
## サーバ起動
# npm run dev
サーバ起動
# npm run dev
backend
File - Open Folder
で backend のフォルダを開く
devcontainer.json(新規)
{
"name": "FastAPI Dev Container",
"dockerFile": "./Dockerfile",
"postCreateCommand": "pip install -r src/requirements.txt"
}
Dockerfile(新規)
ENVとRUNのapt-getのとこはpythonやnextjsでもかまわずコピペでやってる
FROM python:3.12.4
ENV TZ=Asia/Tokyo
RUN apt-get update && apt-get install -y \
bash curl git openssh-client zip \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Install pip
RUN python -m pip install --upgrade pip
requirements.txt
fastapi
uvicorn
devcontainerを起動
左下のへんなマークを押して Reopen in Conteiner
devcontainerを起動したときの処理の流れは
- devcontainer が dockerFile をビルドする
- 終わったら postCreateCommand を実行する
{
"name": "FastAPI Dev Container",
"dockerFile": "./Dockerfile",
"postCreateCommand": "pip install -r src/requirements.txt"
}
ハマりがちなのが、親ディレクトリに遡ることはできませんという仕様。pip install
を Dockerfile
のなかでやろうとしたときに、大概この仕様で大ハマリする
(ChatGPT)
Dockerfile内では、ビルドコンテキストが制限されており、親ディレクトリに遡ることはできません。これはセキュリティとコンテナの隔離を保つためです。具体的には、以下のような制限があります:
ビルドコンテキストの制限: Dockerfileは、指定されたビルドコンテキスト内でのみファイルをコピーしたり、アクセスしたりできます。ビルドコマンドを実行する際に指定したディレクトリ(例えば、docker build -t myapp .で.を指定した場合、そのディレクトリがビルドコンテキストになります)に制限されます。
COPYコマンドの制約: COPYやADDコマンドで親ディレクトリやそれ以外のディレクトリからファイルをコピーすることはできません。例えば、COPY ../file.txt /app/のように親ディレクトリを指定すると、エラーが発生します。
main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
README.md
## サーバ起動
# cd src
# uvicorn main:app --host 0.0.0.0 --port 8000 --reload
サーバ起動
# cd src
# uvicorn main:app --host 0.0.0.0 --port 8000 --reload