VSCodeのRemote Containerでphp-apacheイメージを利用したところ、localhostへのアクセスがERR_EMPTY_RESPONSE
を返しました。ポートなどの設定も見直しました(docker上のアプリにlocalhostでアクセスしたらERR_EMPTY_RESPONSEが出る)が問題がなく悩みました。
環境
- Windows10 WSL(Ubuntu 20.04)
- Docker Desktop for Windows
- VSCode 1.52.1(Nov 2020)
原因
Apacheのサービスが起動していませんでした。
コンテナ内で下記コマンドによりサービスの起動を確認したところ、apache2が起動していないことが分かります。
$ service --status-all
[ - ] apache-htcacheclean
[ - ] apache2
[ ? ] hwclock.sh
[ - ] procps
WSLからdocker run
した場合は自動的に起動していたので、Remote Containerでも起動しているものだと思っていました。
解決法
devcontainer.json
でコンテナ起動後にデフォルトのコマンド(Apacheの起動コマンド)が実行されるように指定する必要があります。
{
"build": {
"dockerfile": "Dockerfile"
},
"mounts": [
"source=${localWorkspaceFolder}/public,target=/var/www/html,type=bind,consistency=cached"
],
"forwardPorts": [80],
+ "overrideCommand": false
}
overrideCommand
はデフォルトではtrue
であり、コンテナ既定のコマンドの代わりに/bin/sh -c "while sleep 1000; do :; done"
を実行するとされています(devcontainer.json reference)。これをfalse
にすることでコンテナ既定のコマンドが起動時に実行されるようになります。
上記はDockerfileを利用した構成ですが、Docker Composeの場合は必須のserviceプロパティがあるのでそれが利用できます。
ちなみに、Dockerfileは下記のようになります。
FROM php:7.4.7-apache
EXPOSE 80
RUN apt-get update && \
apt-get install -y --no-install-recommends \
git \
vim \
unzip \
libonig-dev \
libzip-dev \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libwebp-dev && \
docker-php-ext-configure gd --with-jpeg --with-webp --with-freetype && \
docker-php-ext-install -j$(nproc) \
mbstring \
zip \
gd \
exif && \
# reduce image size
apt-get clean && \
rm -rf /var/lib/apt/lists/*
COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY --from=node /usr/local/bin/ /usr/local/bin/
COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules
RUN a2enmod rewrite headers
補足
overrideCommand
を変更する以外の方法として、明示的にApacheを起動するコマンドを指定することもできます。この場合はdevcontainer.json
に
"postStartCommand": "service apache2 start"
を追加します。