在创建开发容器之前配置环境变量

Jos*_*ett 16 docker-compose visual-studio-code vscode-remote vscode-devcontainer

我正在尝试将远程容器与我的docker-compose.yaml.

但是,我的撰写文件正在利用变量替换功能。

services:
    command: yarn server
    environment:
        MONGO_URI: mongodb://database:27017/todo
    ports:
        - ${SERVER_PORT}:3000
        - ${SERVER_DEBUG_PORT}:9320
Run Code Online (Sandbox Code Playgroud)

Makefile通常,我从包装docker-compose我运行以启动开发环境的命令的变量中设置这些变量。

在扩展通过创建开发容器之前如何设置这些环境变量docker-compose

我尝试initializeCommand通过以下方式使用它。

devcontainer.json

"initializeCommand": ". ./env.sh"
Run Code Online (Sandbox Code Playgroud)
"initializeCommand": "source env.sh"
Run Code Online (Sandbox Code Playgroud)

我也尝试remoteEnvdevcontainer.json.

我也尝试过设置settings.terminal.integrated.env.linux

Tom*_* Yu 6

似乎不可能将在initializeCommand中创建的env作为env变量传递给docker build命令。我的解决方案是在initializeCommand中创建一个env文件,并将其与构建上下文一起传递。

这是 .devcontainer/devcontainer.json

{
  "build": {
    "dockerfile": "Dockerfile",
    "args": {
      "USERNAME": "${localEnv:USER}"
    }
  },
  "initializeCommand": "echo -e \"USERNAME=$USER\nUSER_UID=$(id -u $USER)\nGROUPNAME=$(id -gn $USER)\nGROUP_GID=$(id -g $USER)\" > .devcontainer/.env"
}
Run Code Online (Sandbox Code Playgroud)

在 Dockerfile 中

FROM xxx

ARG USERNAME=user
USER root

# Copy the .env file to the container
COPY .env /tmp/.env
# Source to use it
RUN source /tmp/.env && rm /tmp/.env && \
    if getent passwd $USERNAME; then userdel -f $USERNAME; fi && \
    if getent group $GROUPNAME; then groupdel $GROUPNAME; fi && \
    if getent group $GROUP_GID; then TMP_NAME=$(getent group $GROUP_GID | cut -d: -f1); groupdel $TMP_NAME; fi; \
    groupadd --gid $GROUP_GID $GROUPNAME && \
    useradd --uid $USER_UID --gid $GROUP_GID -m $USERNAME && \
    echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME && \
    chmod 0440 /etc/sudoers.d/$USERNAME && \
    chown $(eval echo ~$USERNAME) && \
    chmod 755 $(eval echo ~$USERNAME)

USER $USERNAME
Run Code Online (Sandbox Code Playgroud)