<style>
.present {
text-align: left;
}
</style>
# VSCode + Docker setup
## For M1 issues with Psycopg2 :(
### Initial setup
1. Install Docker ([instructions here](https://docs.docker.com/desktop/mac/install/))
- Follow the "Mac with Apple Silicon" instruction to install Rosetta2
- Then click the install button for "Mac with Apple Chip"
2. Open your code in VSCode
3. Install the VSCode extension `Remote - Containers` (by Windows)
4. Return to the `Explore` view to see your files. Click the green button in the bottom left corner:

5. A menu will pop up with some options. Click `Reopen in Container`:

6. It will then ask what type of container you want to open. Click `Python 3 & PostgreSQL`.
7. VSCode will now build the container! This might take a few minutes.
### Quick note about virtual environments
If you opened up an existing directory in the container that has a `.venv`, you will need to delete it once you are in the Docker container:
```python=
pipenv --rm
```
Then you can recreate it like so using the `Pipfile` that exists in the directory:
```python=
pipenv install
```
A new `.venv` will be created in a different location in your Docker container. That's ok!
### Setting up the database
Because your postgres Docker container is separate from your local postgres instance, we need to create a database & user within the Docker container.
1. We will need the `CONTAINER ID` for the container running the `postgres:latest` image. This is usually the second container listed. Open an external terminal window and run `docker ps` to see all running containers:
```python=
docker ps
```
2. We are going to enter the container running the `postgres:latest` image. To do so, run this command in the external terminal window:
```python=
docker exec -it <POSTGRES_CONTAINER_ID> psql -U postgres
```
3. You should now be in the `psql` shell within the postgres Docker container. The command prompt should look like so:
```python=
postgres=#
```
4. Create the user and database as you normally would using the same credentials your app will use:
```python=
create user <user_name> with password '<password>';
create database <db_name> with owner <user_name>;
```
5. This is all we need to do in the postgres Docker container psql shell. You can choose to exit the `psql` shell now or leave it open! You can always return to this shell with the same command to look at your database tables & records:
```python=
docker exec -it <POSTGRES_CONTAINER_ID> psql -U postgres
```
6. Now we need to configure our Python Docker container to access this database. In your VSCode window, open the `.devcontainer/devcontainer.json` file.
7. In the `sqltools.connections` entry under `settings`, change the `database`, `username`, and `password` entries to use the correct credentials for your app:
```python=
"settings": {
"sqltools.connections": [{
"name": "Container database",
"driver": "PostgreSQL",
"previewLimit": 50,
"server": "localhost",
"port": 5432,
"database": "YOUR_DB_NAME",
"username": "YOUR_USER_NAME",
"password": "YOUR_USER_PASSWOD"
}],
```
### Leaving the container
To return to your local version of this directory, click the green button in the bottom left corner that says `Dev Container: Python 3 & PostgreSQL @ desktop-linux`.
A menu will pop up. Click the option that says `Reopen Folder Locally`. This will take you out of the Docker container and back to your local version of the directory.
You may need to recreate your `.venv` locally if you previously deleted it in the container:
```python=
pipenv install
```
### You should now be able to interact with your database within the Docker container open in your VSCode window. Happy coding!