kikiki445
@kikiki445

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

DockerをVScodeで開きたいがエラーが出る

解決したいこと

dockerをvscodeで開きたいがエラーが出た。phpの学習用に作っておいたdbコンテナがvscodeで開けません。どうすればよいでしょうか。

スクリーンショット (636).png

Dockerfile

FROM php:8.0-apache

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

RUN apt-get update && apt-get install -y \
    git \
    && docker-php-ext-install pdo_mysql
    
RUN sed -i 's!/var/www/html!/var/www/app/public!g' /etc/apache2/sites-available/000-default.conf```

docker-compose.yml

version: '3'
services:
  app:
    build: ./docker
    ports:
      - 80:80
    volumes:
      - ./app:/var/www/app
    working_dir: /var/www/app
  db:
    image: mysql:8.0
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: database
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
0

4Answer

最初の画像と同じエラーが出てしまいます...

私も、やはり tar が足りないとは思うのですが、ログを見ると /root/.vscode-server/... に書き込もうとする時点で「tar コマンドがありません」エラーが出ています。

おそらく Dockerfiledocker-compose.yml ではなく /.devcontainer/devcontainer.yml に問題がある気がします。 VSCode の拡張機能などをコンテナにインストールする際に失敗しているのかもしれません。

/.devcontainer/ 下で docker build -t test:local . docker compose build してもエラーは出ないのではないでしょうか。

その場合、経験的に Docker イメージの pullbuild に失敗しているケースが多いです。特に Docker Desktop などのアップデート待ちや、使われないコンテナが溜まっていた場合などです。

他のプロジェクトのコンテナを走らせていないのであれば、VSCode、Docker Desktop、OS のアップデート待ちなどがないか確認してから、docker system prune -a で古いイメージやコンテナを一旦綺麗に消して再度試してみてどうでしょう。

また、空のディレクトリで Add Development Container Configuration Files から PHP & MarigaDB などのテンプレートを使ってまっさらな状態で起動するかなど、切り分けをする必要があると思います。

2Like

VSCodeからmysqlイメージのコンテナに接続する際、tar: command not foundでエラーが発生してしまいます。

①コンテナに接続したいだけであれば、下記コマンドでターミナルから接続することができます。

docker-compose exec db bash

②どうしてもVSCodeから接続したい場合

  1. DBコンテナでtarを実行できるようにするか、(mysqlイメージの場合は実現できなそうです)
  2. DBコンテナのイメージをmariadbに変更すればVSCodeから接続できるかと思います。

※2の方がさくっとできるかと思います!

mysqlとmariadbは互換性があるため、アプリは動作するかと思います。

mariadbのイメージにする場合は、docker-compose.ymlを下記に修正することで対応できます。

version: '3'
services:
  app:
    build: ./docker
    ports:
      - 80:80
    volumes:
      - ./app:/var/www/app
    working_dir: /var/www/app
  db:
    image: mariadb:10.2
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: database
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
1Like

Comments

  1. @kikiki445

    Questioner

    編集して起動してもこんな感じでエラーが出てしまいます
    このエラーの意味がよくわからなくて....
    ```
    2022-08-19 15:19:52+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.2.44+maria~bionic started.
    2022-08-19 15:19:52+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
    2022-08-19 15:19:52+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.2.44+maria~bionic started.
    2022-08-19 15:19:52+00:00 [Note] [Entrypoint]: MariaDB upgrade information missing, assuming required
    2022-08-19 15:19:52+00:00 [Note] [Entrypoint]: MariaDB upgrade (mysql_upgrade) required, but skipped due to $MARIADB_AUTO_UPGRADE setting
    ```

macOS ですが VSCode + Remote-Containers + Docker 環境で、PHP + MySQL の起動およびスクリプトの正常実行ができました。以下の構成と違いを比べてみてどうでしょう?

別コンテナの MySQL DB に接続してテーブルがない場合は作成するだけのシンプルなスクリプトで試してみました。

ディレクトリ構成
$ tree
.
├── .devcontainer
│   ├── Dockerfile
│   ├── devcontainer.json
│   └── docker-compose.yml
├── .vscode
│   └── launch.json
└── sample.php
sample.php
sample.php
<?php

// Create connection
$con = mysqli_connect("db", "user", "pass", "database");

// Check connection
if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    exit(1);
}

// Defer close connection
register_shutdown_function("mysqli_close", $con);

// Query to create table
$sql = "CREATE TABLE IF NOT EXISTS MyTable(Column1 CHAR(30), Column2 CHAR(30), Column3 INT)";

// Execute query
if (!mysqli_query($con, $sql)) {
    echo "Error creating table: " . mysqli_error($con);
    exit(1);
}

echo "Successfully table created";

.devcontainer/Dockerfile
Dockerfile
# Default image
ARG VARIANT=8-bullseye

# -----------------------------------------------------------------------------
#  Main stage
# -----------------------------------------------------------------------------
FROM mcr.microsoft.com/vscode/devcontainers/php:0-${VARIANT}

# Install DB client
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
    && apt-get install -y \
        mariadb-client \
        # Add ping to verify db container. E.g. `ping db`
        iputils-ping \
    # Cleanup
    && apt-get clean -y && rm -rf /var/lib/apt/lists/*

# Install php-mysql driver
RUN docker-php-ext-install mysqli pdo pdo_mysql

# No Node.js
# [Choice] Node.js version: none, lts/*, 16, 14, 12, 10
ARG NODE_VERSION="none"
RUN \
    if [ "${NODE_VERSION}" != "none" ]; then \
        su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; \
    fi
.devcontainer/devcontainer.json
devcontainer.json
// See: https://aka.ms/devcontainer.json
{
	"name": "PHP & MySQL",
	"dockerComposeFile": "docker-compose.yml",
	"service": "app",
	"workspaceFolder": "/workspace",
	"customizations": {
		"vscode": {
			"extensions": [
				"bmewburn.vscode-intelephense-client",
				"mrmlnc.vscode-apache",
				"xdebug.php-debug"
			]
		}
	},

	// For use with PHP or Apache
	"forwardPorts": [8080, 3306],

	// Run as non-root user. See: https://aka.ms/vscode-remote/containers/non-root.
	"remoteUser": "vscode"
}

.devcontainer/docker-compose.yml
docker-compose.yml
version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        VARIANT: "8.0-bullseye"
        NODE_VERSION: "none"

    volumes:
      - ..:/workspace:cached

    command: sleep infinity

    # DB のコンテナと同じネットワークで走らせる
    network_mode: service:db
    user: vscode

  db:
    image: mysql:8.0
    restart: unless-stopped
    volumes:
      - my-db-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: database
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"

volumes:
  my-db-data: null

.vscode/launch.json
launch.json
{
    // See: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "hostname": "0.0.0.0"
        }
    ]
}
動作環境
  • ホスト
$ date
2022年 8月20日 土曜日 11時42分26秒 JST

$ # OS
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H2026

$ # Docker
$ docker --version
Docker version 20.10.17, build 100c701

$ # VSCode
$ code --version
1.70.2
e4503b30fc78200f846c62cf8091b76ff5547662
x64
  • コンテナ
$ php --version
PHP 8.0.20 (cli) (built: Jun 23 2022 08:20:39) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.20, Copyright (c) Zend Technologies
    with Xdebug v3.1.5, Copyright (c) 2002-2022, by Derick Rethans

$ code --list-extensions --show-versions
Dev Container: PHP & MySQL にインストールされている拡張機能:
bmewburn.vscode-intelephense-client@1.8.2
mrmlnc.vscode-apache@1.2.0
MS-CEINTL.vscode-language-pack-ja@1.70.8170911
xdebug.php-debug@1.27.0
1Like

エラーメッセージに

/bin/sh: line 9: tar: command not found

って表示されてるから、tarもインストールしたらいいんじゃないのかな?

RUN apt-get update && apt-get install -y \
    git tar \
    && docker-php-ext-install pdo_mysql
0Like

Comments

  1. @kikiki445

    Questioner

    最初の画像と同じエラーが出てしまいます...

Your answer might help someone💌